Spring安全性PreAuthorize SPEL的权限名称包含“ROLE_ADMIN”

时间:2016-04-29 19:43:53

标签: spring spring-security spring-el

我有权威名称: “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',...)“?

2 个答案:

答案 0 :(得分:1)

我想出了办法。

SPEL能够获得主体,因此解决方案是检查principal.authorities中的所有权限,并搜索名称以“ROLE_ADMIN”开头的权限。代码片段如下:

@PreAuthorize(“#principal.authorities。?[authority.startsWith('ROLE_ADMIN')]。size()> 0”) public Object apiName(Principal principal){...}

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

干杯!

答案 1 :(得分:0)

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