В приложении для весенней загрузки я использую SecurityContextHolder.getContext().getAuthentication()
, чтобы получить основную часть объекта Authentication
. Проблема в том, что этот объект иногда null
. Я использую фильтр для установки объекта Authentication
с этим кодом:
public class SecurityRequestFilter extends GenericFilterBean {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
CloudAuthentication authentication = new CloudAuthentication();
SecurityContextHolder.getContext().setAuthentication(authentication);
filterChain.doFilter(request, response);
SecurityContextHolder.getContext().setAuthentication(null);
}
}
В WebSecurityConfigurerAdapter
я включаю этот фильтр:
@Configuration
public class SecurityConfigurer extends WebSecurityConfigurerAdapter implements ImportAware {
protected void configure(HttpSecurity http) throws Exception {
// some code before
http.addFilterBefore(new SecurityRequestFilter(), UsernamePasswordAuthenticationFilter.class);
}
}
Затем в другом Spring Bean Я выполняю этот код:
@Configuration
@RequestScope
public class PrincipalFactory {
public SSOPrincipal getPrincipal() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return authentication.getPrincipal();
}
}
У меня есть тест почтальона для вызова остальной конечной точки. Моя коллекция тестов производит 100 итераций этого теста, и у меня параллельно работают три набора тестов. В результате я получаю NullPointerException
примерно в 3 из 300 случаев, и каждый раз объект Authentication
равен null
. Если я отлаживаю приложение и проверяю трассировку стека, я вижу, что каждый раз ненулевой объект устанавливается как Authentication
объект в классе SecurityRequestFilter
. Так что я понятия не имею, почему этот объект иногда null
. Такое чувство, что пружина использует не ту нить, чтобы получить SecurityContext
. У тебя есть идеи? Или, может быть, вы можете дать мне подсказку, какой весенний класс мне нужно отладить, чтобы получить более глубокое понимание.