Цепочка AbstractAuthenticationProcessingFilter при успешной аутентификации

#spring #spring-security

#spring #spring-безопасность

Вопрос:

Привет, у меня есть фильтр для получения авторизации из 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
  

}

Проблема в том, что когда я достигаю успешной аутентификации и выполняю цепочку.После выполнения фильтра я получаю исключение «servlet.service() для сервлета [DispatcherServlet] в контексте с path [] выдало исключение [Ошибка обработки запроса; вложенным исключением является java.lang.Исключение IllegalStateException: не удается вызвать sendError() после того, как ответ был зафиксирован] по основной причине» И я не могу получить свою конечную точку. Я также замечаю, что authResult генерирует много (объектов?) с теми же данными, даже если я вхожу в систему только один раз

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

Ответ №1:

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