使用@controlleradvice注解@exceptionhandler(exception.class)正在工作,但@exceptionhandler({authenticationexception.class)不工作

taor4pac  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(328)

我想用 @ControllerAdvice 在spring boot中返回自定义json响应的注解。下面是我的代码。 defaultExceptionHandler 如果应用程序中有错误或spring引导服务引发异常,则调用fine。但是 handleAuthenticationException 即使我输入了错误的凭据也不会被调用。在这种情况下,将返回默认的spring引导响应。此服务是安全配置,设置为使用基本身份验证。

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class GlobalExceptionHandler {

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    @ExceptionHandler({AuthenticationException.class})
    public ServiceError handleAuthenticationException(final Exception ex) {
        //LOGGER.error(ex.toString(), ex);
        return new ServiceError(ServiceErrorCode.REQUEST_INVALID, ex.getMessage());
    }

    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public ServiceError defaultExceptionHandler(final Exception ex) {
        //LOGGER.error(ex.toString(), ex);
        return new ServiceError(ServiceErrorCode.SERVICE_ERROR, ex.getMessage());
    }
}

获取返回而不是自定义响应的默认响应:

{
"timestamp": 16654436345,
"status": 401,
"error": "Unauthorized",
"message": "Bad credentials",
"path": "/mycontroller"}

安全配置类:

@Configuration
public static class ServiceWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.
            csrf().
            disable().
            exceptionHandling().
        and().
            headers().
            frameOptions().
            disable().
        and().
            sessionManagement().
            sessionCreationPolicy(SessionCreationPolicy.STATELESS).
        and().
            authorizeRequests().
            antMatchers("/service/**").authenticated().
            antMatchers("/health").permitAll().
            antMatchers("/metrics").permitAll().
            antMatchers("/info").hasAuthority(AuthoritiesConstants.ADMIN).
            anyRequest().authenticated().and().httpBasic();
    }
}
mwngjboj

mwngjboj1#

springmvc基于servlet,springsecurity基于filter,filter在servlet之前,所以控制器中的异常处理程序不会被执行,因为它在filter中已经失败了。
如果你想处理 AuthenticationException ,您需要处理它才能实现 AuthenticationEntryPoint 并覆盖 commence 方法。

public void commence(HttpServletRequest request, HttpServletResponse response,
        AuthenticationException authException) throws IOException, ServletException

http.exceptionHandling().authenticationEntryPoint(myEntryPoint()); AuthenticationException 以及 AccessDeniedException 已由处理 ExceptionTranslationFilter . 你只需要注射 AuthenticationEntryPoint 以及 AccessDeniedHandler (哪个手柄 AccessDeniedException )

相关问题