ThinkPHP6项目基操(16.实战部分 redis+token登录)

redis+token登录

  • 前言
  • 一、生成唯一token
  • 二、设置token并返回token到前端
  • 三、登录拦截器(需要登录/不需登录)

前言

登录一般可以使用session处理,它使用比较简单,但是一般用在web端比较多。如果需要考虑在多端运行,使用redis+token方式更加方便,为啥使用redis而不是使用数据库存储token呢?当然数据库是可以存储的,后台可以请求数据库查询token字段,但是如果考虑高并发的情况,redis更加适合,一般查询用户信息的地方不会很多,判断用户是否登录的情况会比较多。

一、生成唯一token

可以新建一个common类,专门放与字符串相关的方法:



namespace app\common\lib;

class Str
{
     
    public static function getLoginToken($string){
     
        // 生成 token
        $str = md5(uniqid(md5(microtime(true)), true));
        return sha1($str . $string);
    }
}

二、设置token并返回token到前端

在登录接口中,先判断参数,如果参数通过,在生成token,将token存于radis中并设置失效时间,然后返回token到前端:

// business层的登录方法
public function login($data){
     
	// 省略登录参数验证与数据库更新操作
	$token = Str::getLoginToken($data["phone_number"]);
	$redisData = [
		"id" => $userId,
		"username" => $username
	];
	// 保存token到redis, 有效期7天
	$res = cache(config("radis.token_pre").$token, $redisData, 7 * 24 * 3600);
	return $res ? ["token" => $token, "username" => $username] : false;
}

这里直接使用cache保存,是因为在cache.php配置文件里设置了方式为redis,详情可以看这篇文章的3.4配置缓存redis:阿里云短信结合redis实现登录

// controller控制器层的登录方法  调用business层的方法
$result = (new User())->login($data);
if($result){
     
	return show(config('status.success'), "登录成功", $result);
}else{
     
	return show(config('status.error'), "登录失败");
}

前端请求成功后获取到token,然后保存下来,下次发请求的时候带上,后台去redis里查询,如果token不存在或过期就会被后台拦截。
ThinkPHP6项目基操(16.实战部分 redis+token登录)_第1张图片

Tips: 这里的token也不是百分百安全,因为如过有用户获取到了token,那么在有效期内这个token可以一直访问到后台数据,这个也是无法解决的事。

三、登录拦截器(需要登录/不需登录)

待写。。。

你可能感兴趣的:(thinkphp,redis,token,thinkphp)