不懂就问,请教一个权限问题,

2020-07-11 11:29:32 +08:00
 zhaoxixiangban

状况是这样的,现在做的项目是用户登录和权限分离的: 1.用户通过用户中心登录,拿到 token ; 2.前端带着 token 访问我这边的应用,在网关这会解出 userId 和 orgId 放在 header 里; 3.我通过请求头拿到 userId 和 orgId 判断是否有相应权限。

上述 shiro 可以实现么

1807 次点击
所在节点    程序员
13 条回复
xuanbg
2020-07-11 11:53:49 +08:00
可以实现,但这个做法可以改进。

你网关上面不是都解析出 userId 了么,那网关上面直接进行鉴权就行了,有权限放行,没权限拦截,直接返回未授权的错误就好了。这样后面的的服务不需要管有没有权限。
zhaoxixiangban
2020-07-11 12:05:47 +08:00
@xuanbg #1 网关下面有多个应用 ,现在想的是各自做各自的权限拦截,方便的话,这个应该怎么个实现,或者有资料没我看看。对这块不懂 [尴尬]
xuanbg
2020-07-11 13:17:17 +08:00
@zhaoxixiangban

在应用服务接口上面鉴权,实际上有个隐含的接口和资源的绑定关系。而在网关上鉴权缺少这个隐性的绑定,那就必须要有一个数据来声明这个关系,让网关知道这次 request 对应的是哪个资源。我们 request 某个接口是通过 url 实现的,那么可以认为 url 就是对应着特定的资源。

接下来就简单了,我们可以把 url 作为资源的标识符,通过角色-用户关系,配置给用户。这个过程就是授权。而鉴权的过程就是拿到用户 ID,查找该用户有没有配置 request 的 url 。有就是有权限,没有就是没有权限。

楼主你可以参考这个开源项目的代码: https://github.com/xuanbg/gateway
inwar
2020-07-11 20:48:05 +08:00
好久前写过一个 shiro session 结合 jwt 的,可以借鉴一下思路

https://github.com/codflow/shiro-web-jwtsession
zhaoxixiangban
2020-07-12 11:34:01 +08:00
@inwar #4 感谢
liuxiaohua
2020-07-13 11:01:38 +08:00
shiro 可以是实现,进入 doGetAuthorizationInfo 方法用 userId 或 orgId 查询用户权限,控制层在用 @RequiresPermissions 注解就能实现权限控制
zhaoxixiangban
2020-07-13 11:09:17 +08:00
@liuxiaohua #6 嗯嗯 现在基本上就是这个思路 ,现在情况是用户访问到我这个应用的时候,已经做过认证了,需要用户无感知在我这边登录。我这边会拦截 @RequiresPermissions 注解,然后判断是否登录,如果没登录就后台 subject.login().然后再做授权。这种方式可以么?
liuxiaohua
2020-07-13 17:14:43 +08:00
流程应该是这样吧:前端带 token 访问你的应用->判断 token 是否失效->(没失效)调用 subject.login()->然后再判断权限
zhaoxixiangban
2020-07-13 17:33:34 +08:00
@liuxiaohua #8 现在到我这 前端只会把用户 ID 和组织 ID 给我,token 在网关那边已经解了。
liuxiaohua
2020-07-13 17:39:31 +08:00
如果 token 在网关校验了的话,那你只需实现 doGetAuthorizationInfo 方法,控制层在用 @RequiresPermissions 注解就行了呀!!!
zhaoxixiangban
2020-07-14 09:33:18 +08:00
@liuxiaohua #10 我也是这么想的,但是不认证( subject.login ())的话,直接用授权会报错。
zhaoxixiangban
2020-07-14 09:39:57 +08:00
@liuxiaohua #10 所以我这边的流程是 :1.拦截 @RequiresPermissions 注解的方法调用; 2.判断是否认证,如没有认证重写认证方法,只要 userId 没有被当前应用禁用就给认证; 3.重写授权方法。 感觉怪别扭的
liuxiaohua
2020-07-14 10:38:33 +08:00
没错就是这样,核心方法就 doGetAuthenticationInfo/doGetAuthorizationInfo 这二个,一个认证一个权限

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

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

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

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

© 2021 V2EX