ThinkPHP6項目基操(16.實戰部分 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

相關文章
相關標籤/搜索