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