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 文档):

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 角色校验中间件

这里提供一个可全局使用的中间件 (推荐用在用户验证中间件前):

/**

* 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 多表用户验证隔离。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

  1. php多用户数据隔离方案,Laravel jwt 多表(多用户端)验证隔离

    Tips: tymon/jwt-auth 作者已通过增加prv字段修复这一问题#1167,但是如果你是用dingo api + jwt 的话,该问题依然存在. JWT 多表验证隔离 为什么要做隔离 当 ...

  2. input blur获取不到当前值_解决 Laravel JWT 多表认证时获取不到当前认证用户的问题...

    问题描述 最近在做一个项目,需要多表认证,分别为admin和user表,我采用的JWT认证方式,但今天遇到了一个问题:使用Auth::user()返回null,也就是说无法获得当前认证的用户. 网上搜 ...

  3. 【国际专场】laravel多用户平台(SaaS, 如淘宝多用户商城)的搭建策略

    想不想用Laravel来搭建一个多用户.或多租户平台?比如像淘宝那样的多商户平台呢?听上去很复杂,不是吗?怎么能一个程序,给那么多的机构用户来用呢?如何协调管理它们呢?数据库怎么搭建呢,是每个商户一个 ...

  4. Laravel 5.5 表单验证

    简介 Laravel 提供了多种方法来验证请求输入数据.默认情况下,Laravel 的控制器基类使用 ValidatesRequests trait,该 trait 提供了便捷方法通过各种功能强大的验 ...

  5. python tcp通信如何实现多人聊天,Python实现多用户全双工聊天(一对一),python多用户,多用户全双工聊天简陋...

    Python实现多用户全双工聊天(一对一),python多用户,多用户全双工聊天简陋 多用户全双工聊天简陋版 简单实现了两个客户端之间的通信,客户端发送消息,先由服务器接收,然后服务器转发到另一客户端 ...

  6. Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理

    Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理 本博文主要介绍 Laravel 框架中 Eloquent  对一对多关系的处理以及在 Laravel Administra ...

  7. Dingo + Laravel + JWT + Entrust + memcache 实现API设计

    Dingo + Laravel + JWT + Entrust + memcache 实现API设计 Dingo Api 是一个为laravel设计的用于API开发的开源包,规范和简化了Api的设计 ...

  8. django后台添加学生-jquery实现表单正则表达式验证,判断是否可以进行提交

    话不多说,先放图 左边的导航就不放代码了,需要再问 (1)视图模板 (2)路由(urls.p) (3)views.py # GET:向服务器 获取 数据 # POST:向服务器 提交 数据 # 添加学 ...

  9. Laravel - JWT登录与验证

    Laravel - JWT登录与验证 参考文献: https://learnku.com/articles/10885/full-use-of-jwt 安装jwt-auth # 建议使用1.0以上版本 ...

最新文章

  1. ACM学习历程—HDU5586 Sum(动态规划)(BestCoder Round #64 (div.2) 1002)
  2. 深入解析ext2文件系统之mke2fs
  3. 检查各计算机所属工作组ip,如何在Win8.1/RT 8.1中添加语言或键盘
  4. java2实用教程第四版实验指导_Java2实用教程(第4版)实验指导与习题解答_IT168文库(精)...
  5. MyEclipse 10.5与ExtJS 4.1.1自动代码提示
  6. 7部署rancher步骤_Rancher发布K3s,真会玩。。
  7. 神经网络算法入门书籍,bp神经网络算法的优点
  8. OpenCV-Python教程:阈值化(threshold,adaptiveThreshold)
  9. 搜狗商业数据库自动化运维平台
  10. Audacious实现cue、ape音乐支持,GBK支持、cue乱码完美解决
  11. 迅雷的php文件_使用迅雷下载.php文件的方法(Picjumbo可用)
  12. Ubuntu20.04谷歌输入法中英切换
  13. 利用线性回归进行销售预测
  14. 三种交换技术及其比较
  15. pyecharts画地图—个性化设置
  16. 使用java获取硬盘序列号
  17. 基于禁忌搜索算法的三维装箱问题
  18. 2022-2028年中国地理信息行业发展战略规划及投资机会预测报告
  19. 用python按行合并多个txt文件
  20. Spring Boot(03)——自动配置

热门文章

  1. 使用codeplex管理WP7项目开发版本
  2. #.NET分别以GET和POST方式抓取远程页面
  3. windows bat脚本中调用Cygwin并执行命令
  4. python Clipping input data to the valid range for imshow with RGB data解决方法
  5. 算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数
  6. 2021考研数一李正元400题、张宇4套卷题目整理
  7. 51Nod幼儿园霸王
  8. C代码开发遇到的问题 变量初始化和结构体指针移动
  9. flex 平铺布局_CSS3 Flex布局(伸缩布局盒模型)学习
  10. java fx消息通知,Java的FX 2警报声