繁体   English   中英

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

[英]How do I restrict access to a URL using Spring security and a property from the spring security object?

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

productList

在安全上下文中,类型为java.util.ArrayList。 如果此列表为空或null,我想限制对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接口的自定义实现来扩展此集。 以下是如何操作的简要指南:

  1. 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
}
  1. 扩展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);
            }
        });
    }
 }
  1. 提供自定义访问决策经理:
<bean id="affirmativeBased" class="org.springframework.security.access.vote.AffirmativeBased">
    <constructor-arg>
        <list>
            <bean class="my.company.MyWebExpressionVoter"/>
        </list>
    </constructor-arg>
</bean>
  1. 应用自定义访问决策经理:
<http pattern="/**" use-expressions="true" access-decision-manager-ref="affirmativeBased">
    <!-- ... -->
</http>
  1. 通过额外的安全操作保护其中一个URL:
<intercept-url pattern="/products" access="hasProducts()"/>

如果你正在寻找检查productList中的元素数量,这里有一个解决方法:

 <intercept-url pattern="/myurl" access="principal.productList.size() > 0" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM