好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Laravel jwt 多表(多用戶端)驗證隔離的實現

Laravel jwt 多表(多用戶端)驗證隔離的實現

熱門標簽:山西回撥外呼系統 昭通辦理400電話 揚州地圖標注app 青島語音外呼系統招商 騰訊外呼管理系統 岳陽外呼型呼叫中心系統在哪里 百應電話機器人服務 河南電銷卡外呼系統哪家強 山西探意電話機器人

Tips: tymon/jwt-auth 作者已通過增加 prv 字段修復這一問題#1167,但是如果你是用 dingo api + jwt 的話,該問題依然存在。#

JWT 多表驗證隔離

為什么要做隔離

當同一個 laravel 項目有多端(移動端、管理端......)都需要使用 jwt 做用戶驗證時,如果用戶表有多個(一般都會有),就需要做 token 隔離,不然會發生移動端的 token 也能請求管理端的問題,造成用戶越權。

會引發這個問題的原因是 laravel 的 jwt token 默認只會存儲數據表的主鍵的值,并沒有區分是那個表的。所以只要 token 里攜帶的 ID 在你的用戶表中都存在,就會導致越權驗證。

我們來看看 laravel 的 jwt token 的原貌:

{
 "iss": "http://your-request-url",
 "iat": 1558668215,
 "exp": 1645068215,
 "nbf": 1558668215,
 "jti": "XakIDuG7K0jeWGDi",
 "sub": 1
}

攜帶數據的是 sub 字段,其他字段是 jwt 的驗證字段。

我們只看到 sub 的值為 1,并沒有說明是那個表或是哪個驗證器的。這個 token 通過你的驗證中間件時,你使用不同的 guard 就能拿到對應表 id 為 1 的用戶(了解 guard 請查看 laravel 的文檔)。

解決辦法

想要解決用戶越權的問題,我們只要在 token 上帶上我們的自定義字段,用來區分是哪個表或哪個驗證器生成的,然后再編寫自己的中間件驗證我們的自定義字段是否符合我們的預期。

添加自定義信息到 token

我們知道要使用 jwt 驗證,用戶模型必須要實現 JWTSubject 的接口(代碼取自jwt 文檔):

?php

namespace App;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements JWTSubject
{
 use Notifiable;

 // Rest omitted for brevity

 /**
  * Get the identifier that will be stored in the subject claim of the JWT.
  *
  * @return mixed
  */
 public function getJWTIdentifier()
 {
  return $this->getKey();
 }

 /**
  * Return a key value array, containing any custom claims to be added to the JWT.
  *
  * @return array
  */
 public function getJWTCustomClaims()
 {
  return [];
 }
}

我們可以看看實現的這兩個方法的作用:

  • getJWTIdentifier 的:獲取會儲存到 jwt 聲明中的標識,其實就是要我們返回標識用戶表的主鍵字段名稱,這里是返回的是主鍵 'id',
  • getJWTCustomClaims:返回包含要添加到 jwt 聲明中的自定義鍵值對數組,這里返回空數組,沒有添加任何自定義信息。

接下來我們就可以在實現了 getJWTCustomClaims 方法的用戶模型中添加我們的自定義信息了。

管理員模型:

/**
 * 額外在 JWT 載荷中增加的自定義內容
 *
 * @return array
 */
public function getJWTCustomClaims()
{
 return ['role' => 'admin'];
}

移動端用戶模型:

/**
 * 額外在 JWT 載荷中增加的自定義內容
 *
 * @return array
 */
public function getJWTCustomClaims()
{
 return ['role' => 'user'];
}

這里添加了一個角色名作為用戶標識。

這樣管理員生成的 token 會像這樣:

{
 "iss": "http://your-request-url",
 "iat": 1558668215,
 "exp": 1645068215,
 "nbf": 1558668215,
 "jti": "XakIDuG7K0jeWGDi",
 "sub": 1,
 "role": "admin"
}

移動端用戶生成的 token 會像這樣:

{
 "iss": "http://your-request-url",
 "iat": 1558668215,
 "exp": 1645068215,
 "nbf": 1558668215,
 "jti": "XakIDuG7K0jeWGDi",
 "sub": 1,
 "role": "user"
}

我們可以看到這里多了一個我們自己加的 role 字段,并且對應我們的用戶模型。

接下來我們自己寫一個中間件,解析 token 后判斷是否是我們想要的角色,對應就通過,不對應就報 401 就好了。

編寫 jwt 角色校驗中間件

這里提供一個可全局使用的中間件 (推薦用在用戶驗證中間件前):

?php
/**
 * Created by PhpStorm.
 * User: wlalala
 * Date: 2019-04-17
 * Time: 13:55
 */

namespace App\Http\Middleware;

use Closure;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;

class JWTRoleAuth extends BaseMiddleware
{
 /**
  * Handle an incoming request.
  *
  * @param $request
  * @param Closure $next
  * @param null $role
  * @return mixed
  */
 public function handle($request, Closure $next, $role = null)
 {
  try {
   // 解析token角色
   $token_role = $this->auth->parseToken()->getClaim('role');
  } catch (JWTException $e) {
   /**
    * token解析失敗,說明請求中沒有可用的token。
    * 為了可以全局使用(不需要token的請求也可通過),這里讓請求繼續。
    * 因為這個中間件的責職只是校驗token里的角色。
    */
   return $next($request);
  }

  // 判斷token角色。
  if ($token_role != $role) {
   throw new UnauthorizedHttpException('jwt-auth', 'User role error');
  }

  return $next($request);
 }
}

注冊 jwt 角色校驗中間件

在 app/Http/Kernel.php 中注冊中間件:

 /**
  * The application's route middleware.
  *
  * These middleware may be assigned to groups or used individually.
  *
  * @var array
  */
 protected $routeMiddleware = [
  // ...省略 ...

  // 多表jwt驗證校驗
  'jwt.role' => \App\Http\Middleware\JWTRoleAuth::class,
 ];

使用 jwt 角色校驗中間件

接下來在需要用戶驗證的路由組中添加我們的中間件:

Route::group([
 'middleware' => ['jwt.role:admin', 'jwt.auth'],
], function ($router) {
 // 管理員驗證路由
 // ...
});

Route::group([
 'middleware' => ['jwt.role:user', 'jwt.auth'],
], function ($router) {
 // 移動端用戶驗證路由
 // ...
});

至此完成 jwt 多表用戶驗證隔離。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Laravel (Lumen) 解決JWT-Auth刷新token的問題
  • laravel5.5安裝jwt-auth 生成token令牌的示例
  • Laravel配合jwt使用的方法實例

標簽:黃南 婁底 宜賓 湛江 銅川 南陽 寶雞 鎮江

巨人網絡通訊聲明:本文標題《Laravel jwt 多表(多用戶端)驗證隔離的實現》,本文關鍵詞  Laravel,jwt,多表,多,用戶端,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Laravel jwt 多表(多用戶端)驗證隔離的實現》相關的同類信息!
  • 本頁收集關于Laravel jwt 多表(多用戶端)驗證隔離的實現的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 夫妻生活一级片| 欧美AV一区二区精品凹凸| 韩国2020理论片在线播放| 公侵犯人妻一区二区三区最新章节| 午夜视频在线观看www中文| 很色很色的视频| 成人动漫一区| 亚洲玉足AV久久影视| 免费观看理论片A片高清免费观看| 久久人人97超碰人人澡高清| 亚洲精品人成网在线播放蜜芽| 国精产品一区一区三区四川| 英语老师乖乖掀起裙子怎么写作文| 国产一区二区美女无遮挡視頻| 色婷婷激情五月综合| Free性丰满69性欧美| 边摸边吃奶边做日本视频| 国产freexxxx性播放麻豆| 自拍刺激华人320区块涩| 91精品国产情侣高潮对白| 听了会硬的30秒娇喘女语音| 日韩精品电影一区亚洲高清| 男人机机桶女人机机| 欧美三级HD中文在线| 性开放欧美瑜伽video| 甜味弥漫萌白酱一区二区| 理论福利午夜| 欧美乱妇高清无乱码| 99精品国产AⅤv8在线观看| 成人图片在线观看| 被公侵犯的30分钟在线观看 | 菠萝蜜的视频在线观看| xxx国产老太婆视频| 欧美性video高清精品| 全部免费毛片在线播放一个| 国产AV一区二区三区幸福宝k8| 最近中文字幕免费完整版| 美女黄视频免费| 电影免费无码午夜福利| 性饥渴少妇XXXⅩOOOO| 临澧县|