我正在尝试过滤我的应用程序中的用户身份验证期间引发的AuthenticationException。我知道这些不能使用 @ControllerAdvice 和 @ExceptionHandler 进行过滤。因此,尝试找出任何处理程序都可以解决我的问题。
已经尝试了 AuthenticationFailureHandler 之类的其他方法,但是由于我正在使用 ResourceServerConfigurerAdapter ,它们不符合我的要求。
请提出建议。
答案 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);
}
....