如何使用Spring安全性和spring安全对象的属性限制对URL的访问?

我正在使用Spring 5.1和Spring security 4.2.我使用XML文件配置了访问规则.我的问题是,如何根据Spring安全上下文中的属性编写拦截规则(对URL的访问控制)?也就是说,我有一个变量

productList

在安全上下文中,类型为java.util.ArrayList.如果此列表为空或null,我想限制对URL的访问.我怎么写这个?我有

ecurity" security-context-repository-ref="myContextRepository"
    auto-config="false" use-expressions="true" authentication-manager-ref="authenticationManager"
    entry-point-ref="loginUrlAuthenticationEntryPoint">
    ...
    

但当然,上面

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);
            }
        });
    }
 }

>提供自定义访问决策管理器:

ecurity.access.Vote.AffirmativeBased">
    Voter"/>
        

>应用自定义访问决策管理器:

>使用其他安全操作保护其中一个URL:

相关文章

这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原...
今天小编给大家分享的是一文解析spring中事务的传播机制,相...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓...