java - spring security - 如何为 WebSecurityExpressionHandler 或其子类 Autowiring 自定义 rootObject?

标签 java spring-security

用于处理 <intercept-url> 中的自定义表达式,我向 WebExpressionVoter 提供了一个自定义表达式处理程序。此自定义表达式处理程序实现 WebSecurityExpressionHandlerDefaultWebSecurityExpressionHandler 相同并覆盖其 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/

相关文章:

java - Vigenère密码实现

java - 字符串替换所有多个字符

security - Grails 安全性

java - Spring Security 获取登录值

java - 无法检索版本一 java SDK/API 中的待办事项详细信息

java - 甲骨文 JVM : invokespecial instruction

java - 使用 Project Reactor 并行调用其余 Web 服务?

java - 如何结合Web/移动用户身份验证

spring - 尝试配置 Spring 4/OAuth 2 时出现 "Unsupported configuration attributes: [IS_AUTHENTICATED_FULLY]"

java - Oauth2 客户端凭证流程 + Spring Boot2 抛出 There is no PasswordEncodermapped > for the id "null"错误