网上有一些关于这个问题的答案,但都不是基于SpringBoot的,一想到SpringBoot还要配置XML文件就头大呀有木有。
以下就是解决方法:
- 在SecurityConfig中添加如下代码
@Bean
public UserDetailsService myUserService(){
return new MyUserDetailsService();
}
- 并且在configure(AuthenticationManagerBuilder auth)方法中将new MyUserService()改为以上的方法名
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(myUserService());
}
- 至此,自定义DetailsService中的Service就可以注入成功了。
- 另外,自定义DetailsService的@Service标注不需要也没关系,因为已经有@Bean标注了
说一下线索:
- Spring Security在Spring加载完Bean之前就加载了(Spring框架中的Web.xml配置相关)
- MyUserDetailsService继承AbstractJUnit4SpringContextTests之后输出applicationContext,发现applicationContext为空,说明Spring没有加载完成
- Spring没有扫描到MyUserDetailsService,否则@Service肯定能达到与@Bean同样的效果
- 这个问题是相当冷门的,所以肯定有一个约定俗成的办法,于是搜一下Spring Security详细搭建就可以找到问题所在了