spring security - 如何为WebSecurityExpressionHandler或其子类自动装配自定义rootObject?

时间:2012-04-10 14:49:09

标签: java spring-security

为了处理<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子类?

1 个答案:

答案 0 :(得分:3)

您可以将WebSecurityExpressionRoot声明为prototype范围内的bean,并使用给定的构造函数参数动态实例化它:

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

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

ApplicationContext可以使用WebSecurityExpressionHandler注入ApplicationContextAware