Java 如何在控制器方法中访问主体而不将其声明为参数?

Java 如何在控制器方法中访问主体而不将其声明为参数?,java,spring,spring-security,Java,Spring,Spring Security,我在带有JWT身份验证的RESTAPI上添加了Spring安全性。现在,我需要从每个控制器方法中的令牌中检索一些数据——无论是用户名还是其他信息 因为几乎我所有的控制器方法都需要一个Principal变量,有没有办法避免将它声明为每个方法的参数 我曾经做过类似的事情,比如: @RequestScope @Component public class MyObj // ... 用法: @Component public class OtherObj { @Autowired

我在带有JWT身份验证的RESTAPI上添加了Spring安全性。现在,我需要从每个控制器方法中的令牌中检索一些数据——无论是用户名还是其他信息

因为几乎我所有的控制器方法都需要一个
Principal
变量,有没有办法避免将它声明为每个方法的参数

我曾经做过类似的事情,比如:

@RequestScope
@Component
public class MyObj // ...
用法:

@Component
public class OtherObj {
    
    @Autowired
    private ObjectProvider<MyObj> provider;

    // ...

    @Override
    public boolean meth() throws Exception {
        MyObj o = provider.getIfAvailable();
        
        // ...
@组件
公共类其他对象{
@自动连线
私有对象提供者;
// ...
@凌驾
公共布尔meth()引发异常{
MyObj o=provider.getIfAvailable();
// ...

但是在那里我发现,如果不存在实例,则会创建它,而不是返回
null
或抛出异常。

您可以创建一个实用程序类,它为您提供主体

public static Principal getPrincipal() {
    SecurityContext securityContext = SecurityContextHolder.getContext();
    return securityContext.getAuthentication().getPrincipal();
}

当然,在这里,如果上下文或身份验证为null,您需要进行null检查。

SecurityContextHolder.getContext().getAuthentication().getPrincipal()
将为您提供主体