我有一个后台任务(使用 Project Reactor 运行,但我认为它不相关),我需要与经过身份验证的用户一起运行以通过一些 @PreAuthorize 注释方法。
我正在做这样的事情:
Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(login, password));
SecurityContextHolder.getContext().setAuthentication(authentication);
但是当我追踪到 authenticationManager 调用时,我发现它使用的是 Spring-Boot 的默认 InMemoryUserDetailsService,而不是我的自定义身份验证配置。无论我是在 Web 请求线程还是在后台线程中运行身份验证,都会发生这种情况。
我不知道它是否相关,但我在集成测试中运行此代码,并带有以下注释(以及其他注释):
@SpringApplicationConfiguration(classes=MyAppConfiguration.class)
@WebAppConfiguration
@IntegrationTest({"server.port:0"})
除了这个问题,我的测试向我的服务器发出了一个经过身份验证的 Web 请求,并且验证得很好。所以我至少知道我系统的 Web 部分正在使用正确的身份验证配置。
这是我的身份验证配置:
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(jsr250Enabled=true, prePostEnabled=true)
public abstract class BaseSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public LocalUserDetailsService localUserDetailsService;
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(localUserDetailsService);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable().httpBasic()
.and()
.authorizeRequests()
.antMatchers( "/admin/**" ).hasRole( "ADMIN" )
}