<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                今天在做項目的時候有一個問題就是Session在開發API的情況下官方是不推薦用的,那么問題來了,用戶信息怎么保存呢?下面來記錄一下我的寫法。 首先我用的是JWT插件對token進行生成及驗證,話不多說,擼起袖子搞起來。 首先寫登錄文件,我的文件創建在app/controller/admin/Login.php,創建完成之后在里面我寫了一個login方法,內容如下: public function login(Request $request): Response { //用$data接收前端發送過來的數據 $data = $request->param(); //這里我用的是驗證器來驗證管理員賬號密碼是否正確 $result = Validate::rule([ 'username' => 'unique:system_user,username^password' ])->check([ 'username' => $data['username'], 'password' => sha1($data['password']) ]); //判斷賬號密碼是否正確 if(!$result){ //賬號密碼正確的話,獲取賬號信息 $userInfo = SystemUser::where('username',$data['username'])->field('id,username,nickname')->find(); //將獲取到的賬號信息進行生成Token數據并保存 $token = signToken($userInfo); //寫入日志 $data['userId'] = $userInfo['id']; $data['nickname'] = $userInfo['nickname']; 這里是寫入日志的方法,自行創建就行 $this->log($data,true); return create(['access_token' => $token],'登錄成功'); }else{ //寫入日志 $this->log($data,false); return create([],'賬號或密碼錯誤,請重新輸入',400); } } 接下來Token的生成與驗證了,我給他寫在了公共文件里,需要注意的是我們要先安裝JWT插件 安裝JWT的方法: ``` composer require firebase/php-jwt ``` 安裝完成之后我們需要引入JWT插件 ``` use Firebase\JWT\JWT; use Firebase\JWT\SignatureInvalidException; use Firebase\JWT\BeforeValidException; use Firebase\JWT\ExpiredException; ``` 下面就是我在公共方法寫的生成與驗證的方法 ``` //這里是生成Token的方法,我們接收傳來的用戶信息 function signToken($userInfo): string { $key = '!@#$%*&'; //這里是自定義的一個隨機字串,應該寫在config文件中的,解密時也會用,相當 于加密中常用的 鹽 salt $token = array( "iss"=>$key, //簽發者 可以為空 "aud"=>'', //面象的用戶,可以為空 "iat"=>time(), //簽發時間 "nbf"=>time()+3, //在什么時候jwt開始生效 (這里表示生成100秒后才生效) "exp"=> time()+14400, //token 過期時間 "data"=>[ //記錄的userid的信息,這里是自已添加上去的,如果有其它信息,可以再添加數組的鍵值對 //token攜帶的信息,從方法傳進來的,如需擴展自定義添加 'userId'=>$userInfo['id'], //用戶ID 'username'=>$userInfo['username'] //登錄賬號 ] ); return JWT::encode($token, $key, "HS256"); //根據參數生成了 token } //這里是驗證Token的方法 function checkToken($token): array { $key = '!@#$%*&'; $status = array("code" => 2); try { JWT::$leeway = 60;//當前時間減去60,把時間留點余地 $decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,這里要和簽發的時候對應 $arr = (array)$decoded; $res['code'] = 1; $res['data'] = $arr['data']; return $res; } catch(SignatureInvalidException $e) { //簽名不正確 $status['msg'] = "簽名不正確"; return $status; }catch(BeforeValidException $e) { // 簽名在某個時間點之后才能用 $status['msg'] = "token失效"; return $status; }catch(ExpiredException $e) { // token過期 $status['msg'] = "token過期"; return $status; }catch(Exception $e) { //其他錯誤 $status['msg'] = $e; return $status; } } ``` 好了,登錄與Token的東西都已經搞定了,接下來我們就是要在TP6里面存儲我們的用戶信息,擼起袖子看代碼 第一步,創建登錄驗證的中間件:app/middleware/LoginCheck.php,代碼如下: ``` <?php declare (strict_types = 1); namespace app\middleware; use app\BaseController; use think\Request; use think\Response; class LoginCheck extends BaseController { /** * 處理請求 * * @param Request $request * @param Closure $next * @return Response */ public function handle(Request $request, \Closure $next): Response { //獲取訪問用戶的token,我這里用的是authorization字段,大家根據自己的項目實況 $token = $request->header('authorization'); //因為前后端分離規范的問題,加上JWT校驗的格式,提交來的Token前面攜帶的Bearer我給干掉 $token = str_replace('Bearer ','',$token); //干掉之后就可以丟給JWT去驗證這個Token是否有效了 $result = checkToken($token); //驗證token是否正確 if($result['code'] !== 1){ return create([],'請登錄后在進行操作',401); }else{ //驗證完成之后我們給返回的用戶信息寫入到request里面 $request->userInfo = $result['data']; return $next($request); } } } ``` 第二步,創建控制器的基類:app/controller/AuthBase.php,里面的代碼寫法: ``` <?php namespace app\controller; use app\BaseController; use think\App; use think\facade\Request; class AuthBase extends BaseController { //在基類設置并調用中間件 protected $middleware = [ 'LoginCheck' ]; public function __construct(App $app) { parent::__construct($app); } } ``` 好了,到此所有的代碼都擼完了,接下來我們在其他方法如果想調用當前登錄的用戶信息,只需要調用: ``` //調用方法 request()->userInfo; //返回的對象 ^ {#83 +"userId": 1 +"username": "admin" } ``` 好了,基本功能就是這么實現的,自己記錄一下,也順便分享給大家做參考,如果有更好的方法,大佬們也可以分享一下。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看