2

为了在 中处理自定义表达式<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 的子类中?

4

1 回答 1

3

您可以将您声明WebSecurityExpressionRootprototype-scoped bean 并使用给定的构造函数参数动态实例化它:

<bean id = "webSecurityExpressionRoot" class = "...WebSecurityExpressionRoot"
    scope = "prototype">
    ...
</bean>

.

SecurityExpressionRoot root = applicationContext.getBean(
    "webSecurityExpressionRoot", authentication, fi);

ApplicationContext可以注入到您的WebSecurityExpressionHandlerusing 中ApplicationContextAware

于 2012-04-10T15:10:54.597 回答