SecurityContextHolder.getContext (). GetAuthentication () иногда является нулевым - PullRequest
0 голосов
/ 22 января 2020

В приложении для весенней загрузки я использую 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. У тебя есть идеи? Или, может быть, вы можете дать мне подсказку, какой весенний класс мне нужно отладить, чтобы получить более глубокое понимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...