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

Spring Security 的注解权限校验 @PreAuthorize 有没有类似于 Shiro 中 @RequirePermission 的通配符匹配啊?

  •  
  •   ShutTheFu2kUP · 2020-07-29 20:25:22 +08:00 · 3222 次点击
    这是一个创建于 1613 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Shiro 中 user:* 的权限能够匹配以下任意一种

    @RequirePermission("user:select")
    @RequirePermission("user:insert")
    @RequirePermission("user:update")
    @RequirePermission("user:delete")
    

    Spring Security 看了以下 @PreAuthorize 里的 hasAuthority() 方法的源码,貌似是没有做类似的通配符匹配。目前的解决办法是自己写了一个比较器,但是这样每个 Controller 都要注入这个比较器,比较麻烦,不知道有没有更好的解决方式?

    11 条回复    2020-07-31 09:01:17 +08:00
    vemier
        1
    vemier  
       2020-07-29 22:40:47 +08:00
    写完自定义类加一下配置就可以了,为什么每个 Controller 都要注入
    vemier
        2
    vemier  
       2020-07-29 22:42:36 +08:00   ❤️ 1
    可以用 @PreAuthorize 的 hasPermission,然后自己实现一个 PermissionEvaluator 暴露成 Bean,Spring Security 会自动注入并调用进行鉴权
    changwei
        3
    changwei  
       2020-07-30 05:02:57 +08:00 via Android   ❤️ 1
    这个甚至不需要 spring security,直接自己在 springmvc 的拦截器中通过第三个 ctx 参数获取到请求 action 的上下文,然后通过反射读取 ctx 上面的你自己写的注解是否存在以及参数为何来增加相应的权限逻辑。。。
    ShutTheFu2kUP
        4
    ShutTheFu2kUP  
    OP
       2020-07-30 09:28:14 +08:00
    @vemier 可以了,感谢大佬。之前是因为我写的类不是实现 PermissionEvaluator 接口,所以在每个 Controller 都注入了这个类,然后在 hasAuthority 的 EL 表达式中再调用这个类的方法。
    ShutTheFu2kUP
        5
    ShutTheFu2kUP  
    OP
       2020-07-30 09:29:55 +08:00
    @changwei 既然都接 Spring Security 了,如果 Spring Security 能够解决的肯定交由 Spring Security 来解决会更好吧。用拦截器又感觉有点造轮子的意思...总之也感谢大佬的回复。
    avk458
        6
    avk458  
       2020-07-30 09:38:45 +08:00
    hasAnyAuthority hasAnyRole 都不适用吗
    playboy0
        7
    playboy0  
       2020-07-30 10:00:53 +08:00
    @ShutTheFu2kUP 老哥方面给几行演示代码嘛,初学 Security,有点困惑如何实现~,感谢
    ShutTheFu2kUP
        8
    ShutTheFu2kUP  
    OP
       2020-07-30 10:32:40 +08:00
    @avk458 这样的话不是每个地方都要写一个*吗...还是用一个类里面统一处理好一点吧
    ```
    @hasAnyAuthority('authority1', '*')
    @hasAnyAuthority('authority2', '*')
    @hasAnyAuthority('authority3', '*')
    ```
    ShutTheFu2kUP
        9
    ShutTheFu2kUP  
    OP
       2020-07-30 10:47:00 +08:00   ❤️ 1
    @playboy0 V2 好像回复解析不了 markdown,我写在有道云笔记里了,不过我也是刚接触不久..有的也可能有问题。

    https://note.youdao.com/ynoteshare1/index.html?id=cff4f444eedfdef3ced0feed44156857&type=note
    lzk50136
        10
    lzk50136  
       2020-07-30 16:31:24 +08:00
    @ShutTheFu2kUP 学习了
    avk458
        11
    avk458  
       2020-07-31 09:01:17 +08:00
    @ShutTheFu2kUP
    既然想要同一个类统一某些权限或者角色那么就用 antMatchers 匹配?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2785 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:05 · PVG 21:05 · LAX 05:05 · JFK 08:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.