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