Фильтровать или обрабатывать AuthenticationException в OAuth2 - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь отфильтровать исключение AuthenticationException, которое выдается во время аутентификации пользователя в моем приложении.Я знаю, что они не могут быть отфильтрованы с помощью @ ControllerAdvice и @ ExceptionHandler .Поэтому попытка выяснить, какой из обработчиков будет работать для моей проблемы.

Уже пробовали разные подходы, такие как AuthenticationFailureHandler , но они не соответствовали моим требованиям, так как я использую ResourceServerConfigurerAdapter .

Пожалуйста, предложите.

1 Ответ

1 голос
/ 10 мая 2019

Исключения безопасности Spring обрабатываются ExceptionTranslationFilter. Вы можете создать собственный фильтр, который обрабатывает AuthenticationException и добавить его после ExceptionTranslationFilter. Безопасность Spring по умолчанию Порядок фильтров .

public class AuthenticationExceptionFilter extends GenericFilterBean {

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
        try {
            chain.doFilter(request, response);
        } catch (final Exception exception) {
            if (exception instanceof AuthenticationException) {
                this.logger.debug("Authentication exception occurred; redirecting to authentication entry point", exception);
            }

            if(exception instanceof AccessDeniedException) {
                ....
            }

            // Check ExceptionTranslationFilter#handleSpringSecurityException(...)
        }

Вы можете зарегистрировать фильтр программно, переопределив метод конфигурации WebSecurityConfigurerAdapter .

@Configuration
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterAfter(new AuthenticationExceptionFilter(), ExceptionTranslationFilter.class);
    }

Для централизованной обработки исключений по всем @RequestMapping: Проверьте ResponseEntityExceptionHandler

Удобный базовый класс для классов @ControllerAdvice, которые хотят обеспечить централизованную обработку исключений во всех @RequestMapping методы через методы @ExceptionHandler.

Этот базовый класс предоставляет метод @ExceptionHandler для обработки внутренние исключения Spring MVC.

Вот пример кода, с которого можно начать:

@ControllerAdvice
public class ExceptionHandler extends ResponseEntityExceptionHandler {
....
@ExceptionHandler({Exception.class})
    public ResponseEntity<Object> handleCustomException(final CustomException exception, final WebRequest request) {

        return handleExceptionInternal(exception,
                                       ErrorOutputDto.create(exception.getErrorIdentifier(), exception.getMessage()),
                                       new HttpHeaders(),
                                       HttpStatus.UNAUTHORIZED,
                                       request);
    }
....
...