SpringSecurity 自定义 AccessDeniedHandler 不生效的问题解决

问题描述

在 Security配置类中 正确配置了 AccessDeniedHandler,但是发现实际运行时 AccessDeniedHandler 没有被触发!

问题原因

出现这种问题的原因一般都是因为项目中还配置了 GlobalExceptionHandler 。

由于GlobalExceptionHandler 全局异常处理器会比 AccessDeniedHandler 先捕获 AccessDeniedException 异常,因此当配置了 GlobalExceptionHandler 后,会发现 AccessDeniedHandler 失效了。

解决方案

  1. 原有的 GlobalExceptionHandler 不用修改,只需要增加一个 自定义的 AccessDeniedExceptionHandler 即可。

  2. AccessDeniedExceptionHandler 如下

    import org.springframework.security.access.AccessDeniedException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    
    /**
     * Created by 大雪冬至 on 2021/7/6.
     * 解决 GlobalExceptionHandler 会消费掉 AccessDeniedException ,导致 AccessDeniedHandler 不会被触发的问题.
     */
    @ControllerAdvice
    public class AccessDeniedExceptionHandler {
        @ExceptionHandler(AccessDeniedException.class)
        public void accessDeniedException(AccessDeniedException e) throws AccessDeniedException {
            throw e;
        }
    }
    
  3. 此时异常就可以被你自定义的 AccessDeniedHandler 处理了

更多参考

https://github.com/spring-projects/spring-security/issues/6908

https://*.com/questions/31074040/custom-accessdeniedhandler-not-called

上一篇:SpringBoot集成SpringSecurity(五)授权控制


下一篇:springboot2.0整合springsecurity前后端分离进行自定义权限控制