为了在 中处理自定义表达式<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 文件中配置我的自定义表达式根,以便我可以将其注入到我的扩展中WebSecurityExpressionHandler
并使用注释将资源注入其中。
问题是WebSecurityExpressionRoot
的构造函数的参数是动态的,在 xml 中将其指定为 bean 时无法指定它们。有没有办法将我的自定义表达式根注入到WebSecurityExpressionHandler
via DI 的子类中?