AuthenticationFailureHandler HttpServletResponse.sendError url - PullRequest
0 голосов
/ 18 января 2019

Я разработал одностраничное веб-приложение с использованием Spring Boot и Spring MVC. Я использую Spring Security и JWT для аутентификации пользователей. Я написал собственный AuthenticationFailureHandler, который работает, но я хочу знать, как я могу контролировать URL-адрес, на который пользователь перенаправляется при возникновении исключения. Мой AuthenticationFailureHandler выглядит так:

public class JwtAuthenticationFailureHandler implements AuthenticationFailureHandler {

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {     
        response.sendError(HttpStatus.UNAUTHORIZED.value(), exception.getMessage());
    }
}

Когда JWT истекает, приложение генерирует AccountExpiredException, метод AuthenticationFailureHandler.onAuthenticationFailure выполняется и пользователь перенаправляется на страницу входа:

http://localhost:8080/login?sessionExpired=true 

Это все хорошо, но я понятия не имею, как генерируется строка запроса sessionExpired = true, и я хочу иметь некоторый контроль над ней. В прошлом я использовал ExceptionMappingAuthenticationFailureHandlers, например:

Map<String, String> mappings = new HashMap<>();
mappings.put(BadCredentialsException.class.getCanonicalName(), BAD_CREDENTIALS_EXCEPTION_URL);
mappings.put(AccountExpiredException.class.getCanonicalName(), ACCOUNT_EXPIRED_EXCEPTION_URL);
mappings.put(CredentialsExpiredException.class.getCanonicalName(), CREDENTIALS_EXPIRED_EXCEPTION_URL);
mappings.put(DisabledException.class.getCanonicalName(), ACCOUNT_INACTIVE_EXCEPTION_URL);
mappings.put(LockedException.class.getCanonicalName(), ACCOUNT_LOCKED_EXCEPTION_URL);
mappings.put(ValidationException.class.getCanonicalName(), VALIDATION_EXCEPTION_URL);

ExceptionMappingAuthenticationFailureHandler exceptionMappingAuthenticationFailureHandler = new ExceptionMappingAuthenticationFailureHandler();
exceptionMappingAuthenticationFailureHandler.setExceptionMappings(mappings);

Поэтому, основываясь на различных исключениях, приведенных выше, я хотел бы иметь возможность перенаправить на следующие URL-адреса:

http://localhost:8080/login?error    
http://localhost:8080/login?accountexpired
http://localhost:8080/login?credentialsexpired
http://localhost:8080/login?accountlocked
http://localhost:8080/login?accountinactive
http://localhost:8080/login?validationerror

Я не уверен, кто должен делать это с response.sendError, и я не знаю, как генерируется строка запроса sessionExpired = true. Я пробовал бросать разные исключения, но URL никогда не меняется.

У меня есть пара вопросов. Можно ли управлять URL-адресом при использовании HttpServletResponse.sendError и, если нет, можно ли установить код HttpStatus при использовании ExceptionMappingAuthenticationFailureHandler.sendRedirect?

1 Ответ

0 голосов
/ 19 января 2019

Почему бы вам не попробовать использовать response.sendRedirect:

        @Override
        public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
                AuthenticationException exception) throws IOException, ServletException {
            final HttpSession session = request.getSession(false);
            if (session != null) {
                request.getSession().setAttribute(WebAttributes.AUTHENTICATION_EXCEPTION, exception);
            }
          //here the logic to get the error type of the exception
          String errorMessage = ????

            redirectStrategy.sendRedirect(request, response,
                    "http://localhost:8080/login?" + errorMessage);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...