【问题标题】:Spring security add ApplicationEventListener to ExpiredJwtExceptionSpring security 将 ApplicationEventListener 添加到 ExpiredJwtException
【发布时间】:2019-04-08 23:43:56
【问题描述】:

我已经使用ApplicationListener<AuthenticationFailureBadCredentialsEvent> 实现了AuthenticationFailureListener 登录失败,并且我所有的Bad Credentials 事件都在同一个类中处理,非常方便,我尝试向ExpiredJwtExceptionSignatureException 添加一个监听器,但我无法确定触发了哪个事件,我试过了 -

@Component
public class ApplicationEventListener implements ApplicationListener<ApplicationEvent>{

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println(event.toString()); //not printed when ExpiredJwtException thrown
    }
}

捕获所有ApplicationEvent,但当其中一个异常发生时,方法onApplicationEvent 不会触发。 我可以捕捉到这个异常,但我想像BadCredentialsException 一样在全球范围内处理它们,由AuthenticationFailureBadCredentialsEvent 处理。 试过AuthenticationFailureExpiredEvent -

@Component
public class ApplicationEventListener implements ApplicationListener<AuthenticationFailureExpiredEvent>{

    @Override
    public void onApplicationEvent(AuthenticationFailureExpiredEvent event) {
        System.out.println("Expired!!"); //same result
    }
}

但仍然无法正常工作。

【问题讨论】:

    标签: java spring spring-security jwt jjwt


    【解决方案1】:

    对此我不确定,我必须检查来源,但是:对于ExpiredJwtExceptionSignatureException,可能未发出应用程序事件。

    可能的解决方案是:

    1. 自己发布事件:正如您所提到的,您能够捕获这些异常,因此一个简单的解决方案是捕获它们,然后发出所需的事件。您只需要自动连接ApplicationEventPublisher,然后调用publishEvent(event)

    2. 使用Filter 在一个地方捕获和处理异常。

    解决方案2示例:

    public class AuthFailureFilter extends GenericFilterBean {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            try {
                chain.doFilter(request, response);
            } catch (ExpiredJwtException | SignatureException exception) {
                handle(exception);
            }
        }
    }
    

    【讨论】:

    • publishEvent 方法成功了,谢谢,我认为因为这个异常不是 Spring 框架的一部分(io.jsonwebtoken.ExpiredJwtException 的一部分),所以没有触发任何事件。
    【解决方案2】:

    我认为在捕获异常时发布ApplicationEvent 的最简单方法是使用ApplicationEventPublisher。无需使用此方法实现ApplicationEvent,因为它将任何对象包装到PayloadApplicationEvent 中,您可以在ApplicationEventListener 中使用并对其进行操作。这适用于 Spring 4.2,这里是官方链接:https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 2015-01-17
      • 2014-03-07
      • 2015-09-05
      • 2014-09-29
      • 2015-11-21
      • 2013-07-29
      • 1970-01-01
      • 2017-06-14
      相关资源
      最近更新 更多