我正在使用Spring 5.1和Spring security 4.2.我使用XML文件配置了访问规则.我的问题是,如何根据Spring安全上下文中的属性编写拦截规则(对URL的访问控制)?也就是说,我有一个变量
@H_404_6@productList
在安全上下文中,类型为java.util.ArrayList.如果此列表为空或null,我想限制对URL的访问.我怎么写这个?我有
@H_404_6@
但当然,上面
@H_404_6@length(principal.productList) > 0
最佳答案
与安全相关的表达式在Spring中具有非常有限的操作集.您可以通过提供org.springframework.security.access.expression.SecurityExpressionOperations接口的自定义实现来扩展此集.以下是如何操作的简要指南:
>在SecurityExpressionOperations上创建包装器并实现所需的操作:
@H_404_6@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并替换标准表达式处理程序:
@H_404_6@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); } }); } }
>提供自定义访问决策管理器:
@H_404_6@
>应用自定义访问决策管理器:
@H_404_6@
>使用其他安全操作保护其中一个URL:
@H_404_6@