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,则用户有调用该方法的权限。
干杯!
我的权威名称是: "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,则用户有调用该方法的权限。
干杯!