为了在 中处理自定义表达式<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 时无法指定它们。有没有办法将我的自定义表达式根注入到WebSecurityExpressionHandlervia DI 的子类中?