Как вернуть другое сообщение об ошибке, разрешенное конкретным производным типом AuthenticationException в пользовательском AuthenticationFailureHandler - PullRequest
0 голосов
/ 18 февраля 2020

Я использую Spring Security для создания аутентификации / авторизации моего блогового приложения. Мы решили использовать RESTful api, чтобы вернуть клиенту сообщение json при обработке ошибки аутентификации на стороне сервера, мне нужно написать пользовательский AuthenticationFailureHandler, например:

public class RganAuthenticationFailureHandler implements AuthenticationFailureHandler {
    private static Logger logger = LoggerFactory.getLogger(RganAuthenticationFailureHandler.class);


    @Override
    public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
        httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
        httpServletResponse.setStatus(HttpStatus.UNAUTHORIZED.value());
        httpServletResponse.getWriter().write("some description");
    }
}

У AuthenticationException есть какой-то конкретный производный тип, опишите точную ошибку, например: UsernameNotFoundException, BadCredentialsException, AuthenticationServiceException ...

Мне кажется, что я должен вернуть другое сообщение об ошибке для другой тип исключения. Например, для UsernameNotFoundException и BadCredentialsException я мог бы вернуть «неправильное имя пользователя или пароль, для AuthenticationServiceException я мог бы возвратить« что-то неправильное произошло во время получения учетных данных, повторите попытку позже »и другой код состояния HTTP ( как 500).

Теперь вот проблема, я знаю, что могу написать код вроде:

if(e instanceof UsernameNotFoundException || e instanceof BadCredentialsException){
    httpServletResponse.getWriter.write("message1");
}else if(e instance of AuthenticationServiceException){
    httpServletResponse.getWriter.write("message2");
}else if(...){
    // ...
}

, чтобы справиться с этим, но, похоже, это не лучшее решение, я должен написать ser ie из else if блока.

Я читал некоторые посты вроде { ссылка }, похоже, использование @ControllerAdvice и HandlerExceptionResolver также не лучшее решение .

Итак, как мне справиться с этой проблемой?

1 Ответ

1 голос
/ 18 февраля 2020

Вы можете принять решение дальше по стеку, используя DelegatingAuthenticationFailureHandler

AuthenticationFailureHandler, который делегирует другим экземплярам AuthenticationFailureHandler, основанным на типе AuthenticationException, переданном в onAuthenticationFailure

...