ThinkPHP6プロジェクトの基本操作(16. redis + tokenログインの実際の戦闘部分)

序文

ログインは一般的にsession処理でき、使用は比較的簡単ですが、一般的にはweb最終的に多く使用されます複数の端末での実行を検討する必要がある場合redis+tokenは、使用する方が便利です。redisデータベースストレージを使用する代わりに使用するのはなぜtokenですか。もちろん、データベースを保存したり、バックグラウンドでデータベースのクエリtokenフィールドをリクエストしたりできますが、同時実行性が高いことを考えると、redis一般的にユーザー情報をクエリする場所が少なく、ログインしているかどうかを判断する場合が多くなります。

1.一意のトークンを生成します

新しい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保存され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を参照してください:Alibaba CloudSMSと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が存在しないか期限切れになると、バックエンドによってインターセプトされます。
ここに写真の説明を挿入

ヒント:これはtoken100%安全ではありません。ユーザーが取得した場合token、有効期間中はtokenいつでもバックグラウンドデータアクセスできるためです。これも解決できない問題です。

3、ログインインターセプター(ログインが必要/ログインは不要)

書かれる。

おすすめ

転載: blog.csdn.net/zy1281539626/article/details/111330224