spring - SecurityContextHolder.getContext() 在 AspectJ 类中不起作用

标签 spring spring-security aop

我创建了一个 @Aspect 类并尝试获取主要对象,例如..

SecurityContextHolder.getContext().getAuthentication() .getPrincipal()

在我的方面类中,但我得到了空指针。我的方面没有可用的上下文。有任何指示吗?

最佳答案

SecurityContextHolder将给定的 SecurityContext 与当前执行线程关联。由于方面在单独的线程上拦截方法(不太确定),因此您可能需要更改安全上下文持有者策略。如SecurityContextHolder提供一系列委托(delegate)给 SecurityContextHolderStrategy 实例的静态方法。 SecurityContextHolder的目的的目的是提供一种方便的方法来指定应该用于给定 JVM 的策略。

如果没有定义策略 SecurityContextHolder类将默认使用 MODE_THREADLOCAL。

因此需要将策略更改为 MODE_INHERITABLETHREADLOCAL。

有两种方法可以指定所需的策略模式。第一种是通过 SYSTEM_PROPERTY 上键入的系统属性来指定它。第二个是调用 setStrategyName(String) before using the class

在Spring中,您需要在应用程序上下文中定义一个bean,如下所示:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass"><value>org.springframework.security.core.context.SecurityContextHolder</value></property>
    <property name="targetMethod"><value>setStrategyName</value></property>
    <property name="arguments">
        <list>
            <value>MODE_INHERITABLETHREADLOCAL</value>
        </list>
    </property>
</bean>

关于spring - SecurityContextHolder.getContext() 在 AspectJ 类中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18229619/

相关文章:

java - Spring 如何适应我的应用程序架构?

java - Spring 和 Thymeleaf session 属性

java - 如何在用于生成 token 的同一过滤器中验证 JWT token

spring - IoC和AOP是什么关系?

java - 如何在 Feign 调用中使用 AOP

Spring Boot : The managed version is 1. 3.2.RELEASE Artifact 在 org.springframework.boot :spring-boot-dependencies:1. 3.2.RELEASE 中管理

java - Spring 3 注释 : xml-less Declarative Transaction Management

grails - 将密码哈希从 SHA 转换为 bcrypt

java - 如何从列表中取出列表?

Ninject 拦截 - 移植到 Ninject 3.0 时的重大更改