过滤或处理OAuth2中的AuthenticationException

时间:2019-05-09 14:34:29

标签: java spring-security oauth oauth-2.0

我正在尝试过滤我的应用程序中的用户身份验证期间引发的AuthenticationException。我知道这些不能使用 @ControllerAdvice @ExceptionHandler 进行过滤。因此,尝试找出任何处理程序都可以解决我的问题。

已经尝试了 AuthenticationFailureHandler 之类的其他方法,但是由于我正在使用 ResourceServerConfigurerAdapter ,它们不符合我的要求。

请提出建议。

1 个答案:

答案 0 :(得分:1)

Spring安全异常由ExceptionTranslationFilter处理。您可以创建一个处理AuthenticationException的自定义过滤器,并将其添加到ExceptionTranslationFilter之后。默认的Spring安全性Filter Ordering

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的configure方法来以编程方式注册过滤器。

@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);
    }
....