java - 过滤或处理 OAuth2 中的 AuthenticationException

标签 java spring-security oauth oauth-2.0

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

已经尝试了不同的方法,例如AuthenticationFailureHandler,但它们不符合我的要求,因为我正在使用ResourceServerConfigurerAdapter

请提出建议。

最佳答案

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

@Configuration
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

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

对于所有 @RequestMapping 的集中异常处理: 查看ResponseEntityExceptionHandler

A convenient base class for @ControllerAdvice classes that wish to provide centralized exception handling across all @RequestMapping methods through @ExceptionHandler methods.

This base class provides an @ExceptionHandler method for handling internal Spring MVC exceptions.

下面是一个示例代码片段,可帮助您入门:

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

关于java - 过滤或处理 OAuth2 中的 AuthenticationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56061801/

相关文章:

java - Eclipse 中的 Tomcat 给出 java.security.UnrecoverableKeyException- 无法恢复 key 错误

java - 有没有办法使用 Hibernate session.get() 获取查询?

spring-security - 如何在 Spring 获取之前捕获 Spring Security 登录表单?

grails - springsecurity与grails-如何拒绝使用逻辑删除属性删除的用户的登录

spring-security - 将用户角色映射到oauth2范围/权限

php - 使用oauth php第二次自动登录twitter

java - 如何将 UCanAccess 连接到使用数据库密码加密的 Access 数据库?

java - 自动生成的静态变量,必须在构造函数中传递以进行对象实例化

javascript - 如何使用 Node.js 和 simple-oauth2 对 LinkedIn 进行身份验证

java - 为 Google App Engine API 后端添加 OAuth 失败