redis+token登陆
前言
登陆通常可使用session
处理,它使用比较简单,可是通常用在web
端比较多。若是须要考虑在多端运行,使用redis+token
方式更加方便,为啥使用redis
而不是使用数据库存储token
呢?固然数据库是能够存储的,后台能够请求数据库查询token
字段,可是若是考虑高并发的状况,redis
更加适合,通常查询用户信息的地方不会不少,判断用户是否登陆的状况会比较多。php
1、生成惟一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); } }
2、设置token并返回token到前端
在登陆接口中,先判断参数,若是参数经过,在生成token
,将token
存于radis
中并设置失效时间,而后返回token
到前端:web
// 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实现登陆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
能够一直访问到后台数据,这个也是没法解决的事。缓存
3、登陆拦截器(须要登陆/不需登陆)
待写。。。安全
本文同步分享在 博客“zy1281539626”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。session