### redis+token登录
* 前言
* 一、生成唯一token
* 二、设置token并返回token到前端
* 三、登录拦截器(需要登录/不需登录)
# 前言
登录一般可以使用`session`处理,它使用比较简单,但是一般用在`web`端比较多。如果需要考虑在多端运行,使用`redis+token`方式更加方便,为啥使用`redis`而不是使用数据库存储`token`呢?当然数据库是可以存储的,后台可以请求数据库查询`token`字段,但是如果考虑高并发的情况,`redis`更加适合,一般查询用户信息的地方不会很多,判断用户是否登录的情况会比较多。
# 一、生成唯一token
可以新建一个`common`类,专门放与字符串相关的方法:
~~~php
<?phpnamespace 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`到前端:
~~~php
// 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实现登录
~~~php
// controller控制器层的登录方法 调用business层的方法
$result = (new User())->login($data);
if($result){return show(config('status.success'), "登录成功", $result);
}else{return show(config('status.error'), "登录失败");
}
~~~
前端请求成功后获取到`token`,然后保存下来,下次发请求的时候带上,后台去`redis`里查询,如果`token`不存在或过期就会被后台拦截。

> Tips: 这里的`token`也不是百分百安全,因为如过有用户获取到了`token`,那么在有效期内这个`token`可以一直访问到后台数据,这个也是无法解决的事。
# 三、登录拦截器(需要登录/不需登录)
待写。。。
- 空白目录
- 使用thinkphp6搭建后端api接口流程
- tp6 uniapp vue 前后端跨域解决方案
- 操作记录
- api00
- 你看看有没有用
- 6666
- Docker安装LNMP环境的详细过程(可部署TP项目)
- LNMP部署thinkphp
- 玩客云Armbian 安装LNMP环境 Docker
- ThinkPHP6项目基操(16.实战部分 redis+token登录)
- ThinkPHP6项目基操(11.实战部分 部署后台静态页面模板及后台登录页面)
- ThinkPHP6项目基操(13.实战部分 项目中的自定义异常处理总结 错误页面API错误)
- ThinkPHP6项目基操(14.实战部分 中间件处理登录流程)
- ThinkPHP6项目基操(12.实战部分 验证码)
- ThinkPHP6项目基操(18.实战部分 表单令牌Token 防CSRF)
- ThinkPHP6项目基操(19.实战部分 Mysql模型事务操作)
- ThinkPHP6项目基操(20.实战部分 数据库操作返回值总结)
- 浏览器端判断当前设备的运行环境
- api
- api异常捕捉
- 写一个中间件
- 统一的参数返回形式
- ThinkPHP6调用模型的方法
- thinkphp6控制器、验证器、模型、service,各层写的内容
