Spring 自动装配用户

Spring autowired user

我有一个身份验证服务和一个客户端模块,可以包含它以检索经过身份验证的用户并验证令牌。

我想要实现的是能够做到这一点: @Autowired MyUser user 检索正确的用户(请求范围)。

我做了什么:

在客户端可以包含的单独模块中:

@Configuration
public class MyUserHolder {
    @Bean
    @Scope(value="request", proxyMode= ScopedProxyMode.TARGET_CLASS)
    public MyUser getMyUser() {
        return (MyUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    }
}

并且在客户端中:

@Autowired MyUser user

MyUser 上没有注释class(正确吗?)

我得到的错误是:

org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [...MyUser] found for dependency [...MyUser]:
expected at least 1 bean which qualifies as autowire candidate for this dependency. 

我不确定问题是否来自对象和注释在另一个模块(包含的 jar)中,或者注释是否不完整...感觉 MyUserHolder 不正确可用在 spring-context

<context:component-scan base-package="com.org.package1,com.org.package2" />

确保包中包含 class 未找到 bean 异常的地方。您可以使用逗号 (,)

分隔多个包扫描

Spring 将检查在 component scan.

中定义的包内自动注册的 bean (annotations)

如果您想在任何地方获取当前用户,我会推荐我的方法。
我创建了 UserUtil class.
当用户未通过身份验证时,您会得到 null。

public static YourUserPrincipalDto getCurrentUser(){
    try {
        return (YourUserPrincipalDto) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    } catch (Exception e) {
        return null;
    }
}

通常当Spring找不到要自动装配的bean 时会出现此问题,这意味着在自动装配之前,需要创建相应的bean。 通过确保应用程序正在扫描(组件扫描)MyUserHolder class,然后在客户端自动连接 MyUser 将解决此类问题。