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

563 阅读1分钟

出现这种问题的原因一般都是因为项目中还配置了 GlobalExceptionHandler 或者 AllExceptionHandler 大概懂这个意思就行。也就是统一异常返回。

我定义的统一异常返回是这样的:

/**
 * @author kerwim
 * Date: 2022/8/10 17:15
 * 异常全局处理
 */
@ControllerAdvice
public class AllExceptionHandler {

    //运行处理异常,处理Exception的异常
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseResult doException(Exception e){
        e.printStackTrace();
        return ResponseResult.errorResult(-999,"系统异常");
    }
}

因为定义了这个所以没有我定义自定义的返回没有生效

我定义的返回没权限是这样的

@Component
public class AccessDeniedHandlerImpl implements AccessDeniedHandler {

    @Override
    public void handle(HttpServletRequest request,
                       HttpServletResponse response,
                       AccessDeniedException accessDeniedException)
            throws IOException, ServletException {

        ResponseResult result = new ResponseResult(HttpStatus.FORBIDDEN.value(),"您的权限不足");
        String json = JSON.toJSONString(result);
        //处理异常
        WebUtils.renderString(response,json);
    }

webutils是个工具类 也列出来吧


public class WebUtils
{
    /**
     * 将字符串渲染到客户端
     * 
     * @param response 渲染对象
     * @param string 待渲染的字符串
     * @return null
     */
    public static String renderString(HttpServletResponse response, String string) {
        try
        {
            response.setStatus(200);
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().print(string);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;
    }
}

结局方法就是 在定义一个自定义的 AccessDeniedExceptionHandler 即可

import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * 全局捕获权限不足异常
 */
@ControllerAdvice
public class AccessDeniedExceptionHandler {

    @ExceptionHandler(AccessDeniedException.class)
    public void accessDeniedException(AccessDeniedException e) throws AccessDeniedException {
        throw e;
    }

}