Tips: tymon/jwt-auth 作者已通过增加 prv 字段修复这一问题#1167,但是如果你是用 dingo api + jwt 的话,该问题依然存在。# JWT 多表验证隔离 为什么要做隔离 当同一个 laravel 项目有多端(移动端、管理端......)都需要使用 jwt 做用户验证时,如果用户
Tips: tymon/jwt-auth 作者已通过增加 prv 字段修复这一问题#1167,但是如果你是用 dingo api + jwt 的话,该问题依然存在。#
携带数据的是 sub 字段,其他字段是 jwt 的验证字段。 我们只看到 sub 的值为 1,并没有说明是那个表或是哪个验证器的。这个 token 通过你的验证中间件时,你使用不同的 guard 就能拿到对应表 id 为 1 的用户()。 解决办法 想要解决用户越权的问题,我们只要在 token 上带上我们的自定义字段,用来区分是哪个表或哪个验证器生成的,然后再编写自己的中间件验证我们的自定义字段是否符合我们的预期。 添加自定义信息到 token 我们知道要使用 jwt 验证,用户模型必须要实现 JWTSubject 的接口():
我们可以看看实现的这两个方法的作用:
移动端用户模型:
这里添加了一个角色名作为用户标识。 这样管理员生成的 token 会像这样:】
移动端用户生成的 token 会像这样:
我们可以看到这里多了一个我们自己加的 role 字段,并且对应我们的用户模型。 接下来我们自己写一个中间件,解析 token 后判断是否是我们想要的角色,对应就通过,不对应就报 401 就好了。 编写 jwt 角色校验中间件 这里提供一个可全局使用的中间件 (推荐用在用户验证中间件前):
注册 jwt 角色校验中间件 在 app/Http/Kernel.php 中注册中间件:
使用 jwt 角色校验中间件 接下来在需要用户验证的路由组中添加我们的中间件:
至此完成 jwt 多表用户验证隔离。 |
2019-06-28
2019-10-03
2019-07-04
2019-06-22
2019-02-12