Поймать и улучшить LockedException и DisabledException - PullRequest
0 голосов
/ 24 июня 2019

Я использую Spring Security с OAuth 2. У моих пользователей OAuth есть поля account_locked и enabled, и я использую их по разным причинам.Например, account_locked для блокировки пользователей и enabled для деактивации пользователей.Когда пользователь пытается войти в систему и имеет блокировку, он получает 401 HTTP-код и сообщение «Учетная запись пользователя заблокирована».Если он деактивирован, он также получает 401 HTTP-код и сообщение «Пользователь отключен».

Я хочу дополнить эти ошибки дополнительной информацией (например, можно улучшить токен с помощью TokenEnhancer), чтобы отличить код блока от деактивированного кода на клиенте.Например, с полем reason_of_fail.Обратите внимание, что я не хочу использовать текстовые сообщения об этих ошибках.

Я уже пытался использовать это (с этот ответ ):

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.exceptionHandling()
            .authencationEntryPoint(unauthorizedHandler)  
            .accessDeniedHandler(accessDeniedHandler);    
}

Ноэти обработчики не ловят LockedException и DisabledException.

Итак, как я могу улучшить эти ошибки с помощью дополнительного поля (пара ключ-значение)?

1 Ответ

1 голос
/ 24 июня 2019

Сервер авторизации

Если вы хотите добавить эту функцию на сервер авторизации, и у вас есть пользовательский AbstractTokenGranter (см. Разговор ниже), затем вы можете перехватить нужные исключения в методе getOAuth2Authentication.
Затем вы можете создать пользовательское исключение, которое расширяет OAuth2Exception и заполняет карту additionalInformation любым из дополнительных полей, которые вам требуются.
В качестве примера того, как это сделать, вы можете увидеть ResourceOwnerPasswordTokenGranter из проекта spring-security-oauth.

Клиент

Если вместо этого вы хотите добавить эту функцию в свой клиент OAuth2, то вы можете использовать пользовательский AuthenticationFailureHandler для перехвата LockedException и DisabledException.
Вот пример конфигурации безопасности:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .oauth2Login()
            .failureHandler(new CustomAuthenticationFailureHandler());
}

И пример кастома AuthenticationFailureHandler:

public class CustomAuthenticationFailureHandler implements AuthenticationFailureHandler {
    @Override
    public void onAuthenticationFailure(HttpServletRequest request,
            HttpServletResponse response, AuthenticationException exception) {
        if (exception instanceof DisabledException) {
            // throw new exception or modify response
        }
    }
}
...