用于处理 <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 文件中配置我的自定义表达式根,以便我可以将其注入(inject)到我的 WebSecurityExpressionHandler
扩展中并使用注解向其中注入(inject)资源。
问题在于 WebSecurityExpressionRoot
的参数的构造函数是动态的,在 xml 中将其指定为 bean 时我无法指定它们。有没有办法将我的自定义表达式根注入(inject)到我的 WebSecurityExpressionHandler
的子类中通过直接投资?
最佳答案
您可以将 WebSecurityExpressionRoot
声明为 prototype
范围的 bean,并使用给定的构造函数参数动态实例化它:
<bean id = "webSecurityExpressionRoot" class = "...WebSecurityExpressionRoot"
scope = "prototype">
...
</bean>
.
SecurityExpressionRoot root = applicationContext.getBean(
"webSecurityExpressionRoot", authentication, fi);
ApplicationContext
可以使用 ApplicationContextAware
注入(inject)到您的 WebSecurityExpressionHandler
中。
关于java - spring security - 如何为 WebSecurityExpressionHandler 或其子类 Autowiring 自定义 rootObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10090996/