xml - 如何在 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/
and/pub/
操作。如何配置xml?如果用户有两个角色(private
以及其他角色中的一个),那么这两个操作都将被允许。
解决方案
WebSecurityExpressionRoot
您可以使用方法实现的扩展boolean hasAnyRoleExcept(String... ignoredRoles)
草图(在没有 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:intercept-url pattern="/**" access="hasAnyRoleExcept('private')"/>
</security:http>
<bean id="myWebSecurityExpressionHandler" class="MyWebSecurityExpressionHandler"/>
推荐阅读
- json - json.load() 从文件到字典返回错误
- ios - 存储动态字符串
- ios - 如何将图像从框架发送到 iOS Swift 中的示例项目?
- reactjs - 为什么我的变量在第一次单击 Apollo Client React 时为空?
- mule - 如何将依赖项添加到 Mulesoft 设计中心 (IPaSS)
- python - 通过请求将数据发布到 Google Analytics
- ios - 使用协议对类似 UITableViewCell 进行分组以减少代码
- php - 如何使用 php 和 socket.io 连接前端?
- django - Django 应用程序中何时生成 Django 会话密钥?
- android - Proguard (R8) 否定操作员不工作以保留某些包以外的任何东西