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