因为有些自定义的逻辑,我重写了DaoAuthenticationProvider(因为有其他的验证身份逻辑,所以我取消框架默认对密码的验证,并注入自己的userServiceDetail)和userDetailService(进行验证身份,其中包括账号密码验证、第三方登录验证等),在运行的过程中遇到了一些异常捕获问题。
在UserDetailSeviceImpl中,我打算在认证失败时抛出异常,再定义一个ExceptionFilter放在JwtAuthenticationFilter 和 UsernamePasswordAuthenticationFilter 之前。由他进行异常的捕获。
发现UsernamePasswordAuthenticationFilter的异常每次都捕获不到,而且还是InternalAuthenticationServiceException类型的异常。
抛出的InternalAuthenticationServiceException异常在这里被捕获到
最后会被failureHandler处理
也就是
最后还是觉得框架设计的挺好。
那有些自定义的过滤器(jwtAuthenticationFilter)还需要自己捕获异常吗?
后来想了一下,无需再解析jwt时抛出异常,如果解析不成功(那就没有认证信息存在Auththentication)就继续往下走过滤器链。因为过滤器链中最后一个过滤器AuthorizationFilter会判断是否有认证信息和是否有权限,如没有则也会抛出异常,他之前的过滤器ExceptionTransitionFilter中也会进行异常的捕获。如果无认证信息,也会执行authenticationEntryPoint配置的处理器,进行异常的处理。
初学security可能有些错误,欢迎指正。