状况是这样的,现在做的项目是用户登录和权限分离的: 1.用户通过用户中心登录,拿到 token ; 2.前端带着 token 访问我这边的应用,在网关这会解出 userId 和 orgId 放在 header 里; 3.我通过请求头拿到 userId 和 orgId 判断是否有相应权限。
上述 shiro 可以实现么
1
xuanbg 2020-07-11 11:53:49 +08:00
可以实现,但这个做法可以改进。
你网关上面不是都解析出 userId 了么,那网关上面直接进行鉴权就行了,有权限放行,没权限拦截,直接返回未授权的错误就好了。这样后面的的服务不需要管有没有权限。 |
2
zhaoxixiangban OP @xuanbg #1 网关下面有多个应用 ,现在想的是各自做各自的权限拦截,方便的话,这个应该怎么个实现,或者有资料没我看看。对这块不懂 [尴尬]
|
3
xuanbg 2020-07-11 13:17:17 +08:00
@zhaoxixiangban
在应用服务接口上面鉴权,实际上有个隐含的接口和资源的绑定关系。而在网关上鉴权缺少这个隐性的绑定,那就必须要有一个数据来声明这个关系,让网关知道这次 request 对应的是哪个资源。我们 request 某个接口是通过 url 实现的,那么可以认为 url 就是对应着特定的资源。 接下来就简单了,我们可以把 url 作为资源的标识符,通过角色-用户关系,配置给用户。这个过程就是授权。而鉴权的过程就是拿到用户 ID,查找该用户有没有配置 request 的 url 。有就是有权限,没有就是没有权限。 楼主你可以参考这个开源项目的代码: https://github.com/xuanbg/gateway |
4
inwar 2020-07-11 20:48:05 +08:00
|
5
zhaoxixiangban OP @inwar #4 感谢
|
6
liuxiaohua 2020-07-13 11:01:38 +08:00
shiro 可以是实现,进入 doGetAuthorizationInfo 方法用 userId 或 orgId 查询用户权限,控制层在用 @RequiresPermissions 注解就能实现权限控制
|
7
zhaoxixiangban OP @liuxiaohua #6 嗯嗯 现在基本上就是这个思路 ,现在情况是用户访问到我这个应用的时候,已经做过认证了,需要用户无感知在我这边登录。我这边会拦截 @RequiresPermissions 注解,然后判断是否登录,如果没登录就后台 subject.login().然后再做授权。这种方式可以么?
|
8
liuxiaohua 2020-07-13 17:14:43 +08:00
流程应该是这样吧:前端带 token 访问你的应用->判断 token 是否失效->(没失效)调用 subject.login()->然后再判断权限
|
9
zhaoxixiangban OP @liuxiaohua #8 现在到我这 前端只会把用户 ID 和组织 ID 给我,token 在网关那边已经解了。
|
10
liuxiaohua 2020-07-13 17:39:31 +08:00
如果 token 在网关校验了的话,那你只需实现 doGetAuthorizationInfo 方法,控制层在用 @RequiresPermissions 注解就行了呀!!!
|
11
zhaoxixiangban OP @liuxiaohua #10 我也是这么想的,但是不认证( subject.login ())的话,直接用授权会报错。
|
12
zhaoxixiangban OP @liuxiaohua #10 所以我这边的流程是 :1.拦截 @RequiresPermissions 注解的方法调用; 2.判断是否认证,如没有认证重写认证方法,只要 userId 没有被当前应用禁用就给认证; 3.重写授权方法。 感觉怪别扭的
|
13
liuxiaohua 2020-07-14 10:38:33 +08:00
没错就是这样,核心方法就 doGetAuthenticationInfo/doGetAuthorizationInfo 这二个,一个认证一个权限
|