我正在使用 Spring 5.1 和 Spring security 4.2。我使用 XML 文件配置了访问规则。我的问题是,如何根据 Spring 安全上下文中的属性编写拦截规则(对 URL 的访问控制)?也就是说,我有一个变量
productList
在 java.util.ArrayList 类型的安全上下文中。如果此列表为空或为空,我想限制对 URL 的访问。我该怎么写?我有
<http name="defaultSecurity" security-context-repository-ref="myContextRepository"
auto-config="false" use-expressions="true" authentication-manager-ref="authenticationManager"
entry-point-ref="loginUrlAuthenticationEntryPoint">
...
<intercept-url pattern="/myurl" access="length(principal.productList) > 0" />
...
</http>
但当然,以上
length(principal.productList) > 0
表达完全错误。有没有正确的写法?
最佳答案
Spring 中与安全相关的表达式的操作集非常有限。您可以通过提供 org.springframework.security.access.expression.SecurityExpressionOperations
的自定义实现来扩展此集。界面。以下是如何操作的简要指南:
SecurityExpressionOperations
上创建包装器并实现所需的操作:class MySecurityExpressionOperations implements SecurityExpressionOperations {
private SecurityExpressionOperations delegate;
public MySecurityExpressionOperations(SecurityExpressionOperations delegate) {
this.delegate = delegate;
}
public boolean hasProducts() {
MyUser user = (MyUser) delegate.getAuthentication().getPrincipal();
return !user.getProductList().isEmpty();
}
// Other methods
}
org.springframework.security.web.access.expression.WebExpressionVoter
并替换标准表达式处理程序:class MyWebExpressionVoter extends WebExpressionVoter {
public MyWebExpressionVoter() {
setExpressionHandler(new DefaultWebSecurityExpressionHandler() {
@Override
protected SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, FilterInvocation fi) {
SecurityExpressionOperations delegate = super.createSecurityExpressionRoot(authentication, fi);
return new MySecurityExpressionOperations(delegate);
}
});
}
}
<bean id="affirmativeBased" class="org.springframework.security.access.vote.AffirmativeBased">
<constructor-arg>
<list>
<bean class="my.company.MyWebExpressionVoter"/>
</list>
</constructor-arg>
</bean>
<http pattern="/**" use-expressions="true" access-decision-manager-ref="affirmativeBased">
<!-- ... -->
</http>
<intercept-url pattern="/products" access="hasProducts()"/>
关于spring - 如何使用 Spring 安全性和 Spring 安全性对象中的属性限制对 URL 的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52212007/