请教下 Spring Cloud GateWay 网关的鉴权和数据权限, 怎么把 token 转换成用户信息 进入其他服务?

2020-03-11 15:27:19 +08:00
 wuzhizuiguo

例如简单判断有没有权限调用某个接口,我在 gateway 里的 filter 判断一下这个 token 存不存在 redis 中(token -> 用户信息).

假设现在有个接口是 api.test.com/user/mail/list/ 接口, 需要传入 userId, 获取到这个用户的邮件列表, 怎么让 gateway 转发请求到 user-service 时, 将请求 header 里的 token 转化为 userId,

userController 里的方法可能是这样的 List<mail> mailList(Long userId);</mail>

除了网关外其他服务 RPC 调用该接口, 也可以只传入 userId 参数 这样的请问该怎么实现?

如果是以前的方法,我可能会把这个方法改为 List<mail> mailList(Long usrId,HttpServletRequest request);</mail>

然后取出 request 中的 token,去 redis 中验证一下, 然后去取出 userId, 但是这样 其他 b.c.d..服务要是 fegin RPC 调用 这个方法时, 就也需要传入 HttpServletRequest/或者 token.

请教下大佬,Spring Cloud GateWay 网关的鉴权和数据权限该怎么做?

7621 次点击
所在节点    Java
24 条回复
wuzhizuiguo
2020-03-12 14:51:09 +08:00
@yang957862615 这个方法 重写请求头 header 的时候, 需要重新 build 一下,不能直接取出来写入. http://lhyd.top/?p=312761
//向 headers 中放文件,记得 build
ServerHttpRequest host = exchange.getRequest().mutate().header("a", "888").build();
//将现在的 request 变成 change 对象
ServerWebExchange build = exchange.mutate().request(host).build();
return chain.filter(build);
wuzhizuiguo
2020-03-20 16:15:58 +08:00
头晕. 暂时放弃了.
选用 将 token(存 redis) 或者 JWT token , 在 tokenFilter(继承 GlobalFilter)中放入 header 之中(jwt 参照 https://blog.csdn.net/CrazyLai1996/article/details/86430457)

然后取本人的数据信息,则使用 @RequestHeader("X-USER-ID") String userId 这种形式去取数据,

那么如果权限高一点的(例如管理员), 那么 RPC 调用其他用户的邮件列表, 可以使用如下方法

用户访问自己的:
@PostMapping("/mail/list")
public Result x(@RequestHeader(value = "auth-userId",required = false)Long authUserId){
return mailService.list(authUserId);
}

用户访问别人的
@PostMapping("/mail/list/{userId}")
public Result maillist(@PathVariable("userId") Long userId){
return mailService.list(userId);
}

RPC 方法
@PostMapping("/user/test/mail/list/{userId}")
public Result mm(@PathVariable("userId")Long userId);

这个 RPC 方法能不能调用, 还是需要 更上面一层的 token 来区分的, 例如传的 userId 能不能不是他本人的, 需要配合 role /permission, 来决定.

即: 这种可能是, /admin/user/list , 然后可以传入 userId 参数, 加上自己的 header 中的 token,来决定 给 rpc 方法中传递的 userId 到底是直接的,还是别人的.

在这个问题中,我最大的困扰是, 怎么将 token 背后的用户信息良好的传递到各个服务中去,
我觉得比较麻烦,但是可行的是, 每个方法里都加个 token 或者 httpservletrequest, 每次需要的时候 都去根据 header/ token (再根据 redis 其他的转换成信息), 但是想想每个 controller service rpc 方法都要带上 token 或者其他的 那也太恐怖了, 不过还有一点.. 如果一个 controller 方法 含有 Httpservletrequest, 那么它的 rpc 方法大概也得带着这么个参数, 那会一直循环循环吗?

还有就是, 各个服务全关了外网端口, 所有请求都要经过除了网关外的 另一个特定服务, 例如 admin,在这个地方进行鉴权, 查看有没有对应的权限 /数据权限,

还是经验不足啊...
yema50
2020-07-31 09:43:11 +08:00
@yang957862615 可以的
jinzhongyuan
2022-01-17 19:28:23 +08:00
@hantsy 看了一下大纲,是个好仓库

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/651876

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX