【问题标题】:Spring security PreAuthorize SPEL for authority names contains "ROLE_ADMIN"权限名称的 Spring security PreAuthorize SPEL 包含“ROLE_ADMIN”
【发布时间】:2016-08-25 02:05:27
【问题描述】:

我的权威名称为: “ROLE_ADMIN” “ROLE_ADMIN_L1” “ROLE_ADMIN_L2” “ROLE_ADMIN_L3” ...

在@PreAuthroize("...")中,我可以使用SPEL检查权限名称是否包含“ROLE_ADMIN”,而不是列出“hasAnyAuthority('ROLE_ADMIN','ROLE_ADMIN_L1','ROLE_ADMIN_L2', 'ROLE_ADMIN_L3',...)"?

【问题讨论】:

    标签: spring spring-security spring-el


    【解决方案1】:

    我认为使用Springs hierarchical roles 会更好。这样您就可以配置所有 ROLE_ADMIN_L1... 也是 ROLE_ADMIN。

    文档中的示例

    <bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter">
        <constructor-arg ref="roleHierarchy" />
     </bean>
     <bean id="roleHierarchy"
            class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
        <property name="hierarchy">
            <value>
                ROLE_ADMIN > ROLE_STAFF
                ROLE_STAFF > ROLE_USER
                ROLE_USER > ROLE_GUEST
            </value>
        </property>
    </bean>
    

    ROLE_ADMIN ⇒ ROLE_STAFF ⇒ ROLE_USER ⇒ ROLE_GUEST

    所以你需要这样的东西:

    <property name="hierarchy">
        <value>
            ROLE_ADMIN_L1 > ROLE_ADMIN
            ROLE_ADMIN_L2 > ROLE_ADMIN
            ROLE_ADMIN_L3 > ROLE_ADMIN
        </value>
    </property>
    

    并使用@PreAuthroize("hasRole('ADMIN')")

    【讨论】:

    • 这不是我想要的。 ROLE_ADMIN 具有全局权限。 ROLE_ADMIN_XXX 具有 ROLE_ADMIN 可以调用的 API 的不同子集。我正在寻找关于 @PreAuthroize("hasAnyAuthority('')) 注释的简单解决方案,而不是在注释中列出一些 ROLE_ADMIN_XXX
    • AFAIK 使用 Spring 的内置工具无法实现您想要的,您可以查看 hasAnyAuthority [这里][github.com/spring-projects/spring-security/blob/… 的实现,它在集合上做了一个简单的包含角色。
    【解决方案2】:

    我想出了一个办法。

    SPEL能够获取principal,所以解决方法是检查principal.authorities中的所有权限,并搜索名称以“ROLE_ADMIN”开头的权限。代码的sn-p如下:

    @PreAuthorize("#principal.authorities.?[authority.startsWith('ROLE_ADMIN')].size() > 0") 公共对象 apiName(Principal principal) {...}

    表达式“#principal.authorities.?[authority.startsWith('ROLE_ADMIN')]”将返回一个数组,其中包含以“ROLE_ADMIN”开头的所有权限名称。如果数组大小大于0,则用户有权调用该方法。

    干杯!

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2020-10-15
      • 2013-10-13
      • 2019-04-02
      相关资源
      最近更新 更多