为了处理<intercept-url>
中的自定义表达式,我为WebExpressionVoter
提供了一个自定义表达式处理程序。此自定义表达式处理程序以与WebSecurityExpressionHandler
相同的方式实现DefaultWebSecurityExpressionHandler
,并覆盖其createEvaluationContext
方法以返回具有自定义根对象集的上下文。此自定义根对象只是使用另一种方法扩展WebSecurityExpressionRoot
。这就是DefaultWebSecurityExpressionHandler的用法:
public EvaluationContext createEvaluationContext(Authentication authentication, FilterInvocation fi) {
StandardEvaluationContext ctx = new StandardEvaluationContext();
SecurityExpressionRoot root = new WebSecurityExpressionRoot(authentication, fi);
root.setTrustResolver(trustResolver);
root.setRoleHierarchy(roleHierarchy);
ctx.setRootObject(root);
return ctx;
}
它创建一个WebSecurityExpressionRoot
的新对象,并将其指定为它返回的评估上下文的根对象,但禁止WebSecurityExpressionRoot
使用DI(因为它的创建不是由Spring处理) 。我想在xml文件中配置我的自定义表达式root ,这样我就可以在WebSecurityExpressionHandler
的扩展名中注入它并使用注释将资源注入其中。
问题是WebSecurityExpressionRoot
的构造函数的参数是动态的,当我在xml中将它指定为bean时,我无法指定它们。有没有办法通过DI将我的自定义表达式root注入我的WebSecurityExpressionHandler
子类?
答案 0 :(得分:3)
您可以将WebSecurityExpressionRoot
声明为prototype
范围内的bean,并使用给定的构造函数参数动态实例化它:
<bean id = "webSecurityExpressionRoot" class = "...WebSecurityExpressionRoot"
scope = "prototype">
...
</bean>
SecurityExpressionRoot root = applicationContext.getBean(
"webSecurityExpressionRoot", authentication, fi);
ApplicationContext
可以使用WebSecurityExpressionHandler
注入ApplicationContextAware
。