V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhaoxixiangban
V2EX  ›  程序员

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

  •  
  •   zhaoxixiangban · 2020-07-11 11:29:32 +08:00 · 1807 次点击
    这是一个创建于 1590 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    上述 shiro 可以实现么

    13 条回复    2020-07-14 10:38:33 +08:00
    xuanbg
        1
    xuanbg  
       2020-07-11 11:53:49 +08:00
    可以实现,但这个做法可以改进。

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

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

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

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

    https://github.com/codflow/shiro-web-jwtsession
    zhaoxixiangban
        5
    zhaoxixiangban  
    OP
       2020-07-12 11:34:01 +08:00
    @inwar #4 感谢
    liuxiaohua
        6
    liuxiaohua  
       2020-07-13 11:01:38 +08:00
    shiro 可以是实现,进入 doGetAuthorizationInfo 方法用 userId 或 orgId 查询用户权限,控制层在用 @RequiresPermissions 注解就能实现权限控制
    zhaoxixiangban
        7
    zhaoxixiangban  
    OP
       2020-07-13 11:09:17 +08:00
    @liuxiaohua #6 嗯嗯 现在基本上就是这个思路 ,现在情况是用户访问到我这个应用的时候,已经做过认证了,需要用户无感知在我这边登录。我这边会拦截 @RequiresPermissions 注解,然后判断是否登录,如果没登录就后台 subject.login().然后再做授权。这种方式可以么?
    liuxiaohua
        8
    liuxiaohua  
       2020-07-13 17:14:43 +08:00
    流程应该是这样吧:前端带 token 访问你的应用->判断 token 是否失效->(没失效)调用 subject.login()->然后再判断权限
    zhaoxixiangban
        9
    zhaoxixiangban  
    OP
       2020-07-13 17:33:34 +08:00
    @liuxiaohua #8 现在到我这 前端只会把用户 ID 和组织 ID 给我,token 在网关那边已经解了。
    liuxiaohua
        10
    liuxiaohua  
       2020-07-13 17:39:31 +08:00
    如果 token 在网关校验了的话,那你只需实现 doGetAuthorizationInfo 方法,控制层在用 @RequiresPermissions 注解就行了呀!!!
    zhaoxixiangban
        11
    zhaoxixiangban  
    OP
       2020-07-14 09:33:18 +08:00
    @liuxiaohua #10 我也是这么想的,但是不认证( subject.login ())的话,直接用授权会报错。
    zhaoxixiangban
        12
    zhaoxixiangban  
    OP
       2020-07-14 09:39:57 +08:00
    @liuxiaohua #10 所以我这边的流程是 :1.拦截 @RequiresPermissions 注解的方法调用; 2.判断是否认证,如没有认证重写认证方法,只要 userId 没有被当前应用禁用就给认证; 3.重写授权方法。 感觉怪别扭的
    liuxiaohua
        13
    liuxiaohua  
       2020-07-14 10:38:33 +08:00
    没错就是这样,核心方法就 doGetAuthenticationInfo/doGetAuthorizationInfo 这二个,一个认证一个权限
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5378 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 01:22 · PVG 09:22 · LAX 17:22 · JFK 20:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.