redis+token登录
前言
登录一般可以使用session
处理,它使用比较简单,但是一般用在web
端比较多。如果需要考虑在多端运行,使用redis+token
方式更加方便,为啥使用redis
而不是使用数据库存储token
呢?当然数据库是可以存储的,后台可以请求数据库查询token
字段,但是如果考虑高并发的情况,redis
更加适合,一般查询用户信息的地方不会很多,判断用户是否登录的情况会比较多。
一、生成唯一token
可以新建一个common
类,专门放与字符串相关的方法:
<?php
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
不存在或过期就会被后台拦截。
Tips: 这里的
token
也不是百分百安全,因为如过有用户获取到了token
,那么在有效期内这个token
可以一直访问到后台数据,这个也是无法解决的事。
三、登录拦截器(需要登录/不需登录)
待写。。。
⭐️重磅推荐:免费商用电商系统
😏想白嫖整个电商系统用来商用?
🤑想有自己的商城实现财富自由?
🤓想学习最佳实践提升自己技术?
快来进入🚀 传送门 🚀,开源免费、完整示例带你快速入门,轻松二开,走上人生巅峰!👨🎓