Spring 授权名称的安全预授权 SPEL 包含 "ROLE_ADMIN"

Spring security PreAuthorize SPEL for authority names contains "ROLE_ADMIN"

我的权威名称是: "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',...)" 中的所有名称吗?

我认为使用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')")

我想办法了

SPEL是可以拿到principal的,所以解决方法是查看principal.authorities中的所有权限,查找名称以"ROLE_ADMIN"开头的权限。代码片段如下:

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

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

干杯!