[英]How to allow any other role in Spring Security?
你将如何做一个表达式来允许访问所有角色,除非一个角色,而不是在 spring-security.xml 中声明它们?
我们有四个角色: private
、 user1
、 user2
和user3
。 private
是唯一可以执行某些服务的角色。 另一个只允许user1
, user2
和user3
。
<http pattern="/priv/**">
<intercept-url pattern="/**" access="hasRole('private')"/>
<http-basic/>
</http>
<http pattern="/pub/**">
<intercept-url pattern="/**" access="!hasRole('private')"/>
<http-basic/>
</http>
我知道这样问题就解决了,但是例如在用户具有private
和user2
的情况下,该用户应该可以执行/priv/
和/pub/
操作。 如何配置xml? 如果用户有两个角色( private
角色和其他角色之一),则这两种操作都将被允许。
您可以利用RoleHierarchy
来简化您的安全配置。
<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_PRIVATE > ROLE_USER
ROLE_USER > ROLE_USER1 > ROLE_USER2 > ROLE_USER3
</value>
</property>
</bean>
然后在您的http
配置中:
<http pattern="/priv/**">
<intercept-url pattern="/**" access="hasRole('PRIVATE')"/>
<http-basic/>
</http>
<http pattern="/pub/**">
<intercept-url pattern="/**" access="hasRole('USER')"/>
<http-basic/>
</http>
这样,您的ROLE_USER
将“嵌入”所有其他ROLE_USERX
规则,而ROLE_PRIVATE
将从ROLE_PRIVATE
嵌入所有ROLE_USER
。
您还应该参考Spring Security Reference 。
您可以使用boolean hasAnyRoleExcept(String... ignoredRoles)
方法实现WebSecurityExpressionRoot
的扩展
草图(在没有 IDE 支持的情况下编写) :
import org.springframework.security.core.authority.AuthorityUtils;
public class MyWebSecurityExpressionRoot extends WebSecurityExpressionRoot {
public MyWebSecurityExpressionRoot(final Authentication a, final FilterInvocation fi) {
super(a, fi);
}
public boolean hasAnyRoleExcept(String... ignoredRoles) {
//see SecurityExpressionRoot.hasAnyRole
Set<String> roles =
AuthorityUtils.authorityListToSet(
getAuthentication().getAuthorities());
//find a not ignored role
for (String role : roles) {
if (!ignoredRoles.contains(role)) {
return true;
}
}
return false;
}
}
要注册它:
public class MyWebSecurityExpressionHandler extends DefaultWebSecurityExpressionHandler {
//Attention: override setTrustResolver too.
private AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl();
@Override
protected SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, FilterInvocation fi) {
MyWebSecurityExpressionRoot root = new MyWebSecurityExpressionRoot(authentication, fi);
root.setPermissionEvaluator(getPermissionEvaluator());
root.setTrustResolver(trustResolver);
root.setRoleHierarchy(getRoleHierarchy());
return root;
}
}
<security:http use-expressions="true" ...>
...
<security:expression-handler ref="myWebSecurityExpressionHandler"/>
</security:http>
<bean id="myWebSecurityExpressionHandler" class="MyWebSecurityExpressionHandler"/>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.