日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php 多用户 判断,Laravel jwt 多表(多用户端)验证隔离的实现

發(fā)布時間:2025/4/5 php 75 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 多用户 判断,Laravel jwt 多表(多用户端)验证隔离的实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

JWT 多表驗證隔離

為什么要做隔離

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

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

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

{

"iss": "http://your-request-url",

"iat": 1558668215,

"exp": 1645068215,

"nbf": 1558668215,

"jti": "XakIDuG7K0jeWGDi",

"sub": 1

}

攜帶數(shù)據(jù)的是 sub 字段,其他字段是 jwt 的驗證字段。

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

解決辦法

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

添加自定義信息到 token

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

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 [];

}

}

我們可以看看實現(xiàn)的這兩個方法的作用:

getJWTIdentifier 的:獲取會儲存到 jwt 聲明中的標識,其實就是要我們返回標識用戶表的主鍵字段名稱,這里是返回的是主鍵 'id',

getJWTCustomClaims:返回包含要添加到 jwt 聲明中的自定義鍵值對數(shù)組,這里返回空數(shù)組,沒有添加任何自定義信息。

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

管理員模型:

/**

* 額外在 JWT 載荷中增加的自定義內(nèi)容

*

* @return array

*/

public function getJWTCustomClaims()

{

return ['role' => 'admin'];

}

移動端用戶模型:

/**

* 額外在 JWT 載荷中增加的自定義內(nèi)容

*

* @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 字段,并且對應(yīng)我們的用戶模型。

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

編寫 jwt 角色校驗中間件

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

/**

* 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的請求也可通過),這里讓請求繼續(xù)。

* 因為這個中間件的責職只是校驗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 多表用戶驗證隔離。

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

總結(jié)

以上是生活随笔為你收集整理的php 多用户 判断,Laravel jwt 多表(多用户端)验证隔离的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产视频一区二区在线观看 | 日韩高清片 | 日韩女优中文字幕 | 亚洲性激情 | 一级国产视频 | 国模大尺度自拍 | 日韩欧美国产激情 | 久久精品国产99久久不卡 | 日韩一级在线播放 | 黄色片视频免费在线观看 | 三级精品在线 | 欧美精品欧美极品欧美激情 | 伊人av影院 | 国产一区不卡在线 | 成人黄色小说在线观看 | 91视频最新| 久久精品人人做人人爽 | 国产一级片在线播放 | 国产一二三精品 | 国产极品美女在线 | 国产农村妇女毛片精品久久 | 在线观看自拍 | a视频在线观看免费 | 日韩在线一级片 | 黄色成人在线免费观看 | 国语对白做受xxxxx在线中国 | 精品久久久无码中文字幕边打电话 | 国产免费久久久 | 中文字幕日韩一区 | 美女18网站 | 午夜精品久久久久久久四虎美女版 | 国产av天堂无码一区二区三区 | 婷婷精品在线 | 在线视频精品 | 精品中文字幕一区二区 | 国产成人精品综合 | www.69视频| 男女午夜激情视频 | 国产高中女学生第一次 | 日韩欧美国产精品综合嫩v 国产小毛片 | 亚洲天堂自拍偷拍 | 伊人午夜 | 涩涩天堂 | 日韩美女视频网站 | 丝袜操 | 久久久久二区 | 久久这里只有精品99 | 97看片网 | 一本高清视频 | 一级片aaaaa| 日韩经典一区 | 午夜av免费在线观看 | 国产欧美日韩综合精品一区二区 | 欧美18—19性高清hd4k | 免费av小说 | 人人澡人人爽 | 潘甜甜在线 | 亚洲日本不卡 | 国产99久久九九精品无码免费 | 国产精彩视频一区二区 | 欧美黄色大片免费观看 | 日韩三级精品 | 国产精品久久久网站 | 中文字幕第五页 | 天天操天天玩 | 色六月婷婷 | 黄网站视频在线观看 | 免费毛片一级 | 黄色三级视频网站 | 男人猛进女人爽的大叫 | 性中国古装videossex | 男女交性视频播放 | 亚洲欧美日韩一区在线观看 | 在线观看黄色大片 | 国产精品成av人在线视午夜片 | 涩涩视频在线观看免费 | 人人爽人人爱 | 韩国伦理片在线观看 | 日本aⅴ视频 | 久久久成| 国产第一页精品 | 午夜a级片 | 中文字幕在线视频播放 | 草草影院国产第一页 | 国产按摩一区二区三区 | 六月婷婷在线 | 97自拍视频| 精品日韩 | 7mav视频| 国产精品久久久久精 | 精品人妻无码一区二区性色 | 超碰资源| 国产一区二区在线免费观看 | 深爱婷婷 | 日韩中文字幕亚洲 | 日韩专区视频 | 超碰国产在线 | 白峰美羽在线播放 | 三级全黄的视频 |