AbstractAuthenticationProcessingFilter цепочка в успешной аутентификации - PullRequest
0 голосов
/ 26 марта 2019

Здравствуйте, у меня есть фильтр для получения авторизации от JWT

public class JwtAuthorizationFilter extends AbstractAuthenticationProcessingFilter {


public JwtAuthorizationFilter() {
    super("/**");
}

@Override
public void setAuthenticationSuccessHandler(AuthenticationSuccessHandler successHandler) {
    super.setAuthenticationSuccessHandler(successHandler);
}


@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
    super.successfulAuthentication(request, response, chain, authResult);

    chain.doFilter(request, response);
}

@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
    String token = request.getHeader("Authorization");
     //code
    return getAuthenticationManager().authenticate(getAuthentication(token));
}

private UsernamePasswordAuthenticationToken getAuthentication(String token) {
  // code

}

Проблема в том, что когда я достигаю successAuthentication и выполняю chain.doFilter, я получаю исключение "servlet.service () для servlet [dispatcherServlet] в контексте с путем [] вызвала исключение [Ошибка обработки запроса; вложенное исключение - java.lang.IllegalStateException: Невозможно вызвать sendError () после того, как ответ был зафиксирован] с первопричиной» И я не могу получить свою конечную точку. Я также заметил, что authResult генерирует много (Objects?) С одинаковыми данными, даже если я вхожу только один раз

@ Edit Теперь я заметил, что после успешной авторизации Spring пытается достичь моего контроллера несколько раз. Сначала возвращаемое значение, а другие просто выкидывают исключения, и я не знаю, почему у меня этот цикл

1 Ответ

0 голосов
/ 26 марта 2019

Что делается внутри super.successfulAuthentication?Если вы вносите какие-либо изменения в объект HttpServletResponse, например, изменяя коды статуса Http или ResponseEntity, вы не сможете перейти к следующему фильтру в цепочке, вызывая chain.doFilter(request, response), поскольку ответ фиксируется и возвращаетсяклиенту.

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