SpringSecurity的异常提示处理"error":"forbidden","message":"Access Denied"

首先,框架是用的SpringBoot+SpringSecurity+SpringSession

这个错误肯定大家都遇到过:

 没有登陆的时候,swagger访问接口会提示这个;如果登陆了,无权限也是返回403,message=forbidden

这个返回对前端来说很不友好;

我参考了很多文章都对我不管用:

1,https://blog.csdn.net/yuanlaijike/article/details/80250389,因为我是前后分离的,这个文章里面的配置对我不管用,不是前后分离的话可以参考参考

2,也尝试了这个方法:SpringBoot的全局消息提示

messages_zh_CN.properties内容: 

AbstractUserDetailsAuthenticationProvider.badCredentials=账号或密码错误,请联系公司管理员
AbstractUserDetailsAuthenticationProvider.credentialsExpired=密码已过期
AbstractUserDetailsAuthenticationProvider.disabled=账号未激活,请完善信息
AbstractUserDetailsAuthenticationProvider.expired=帐号已过期
AbstractUserDetailsAuthenticationProvider.locked=账号已被禁用,请联系公司管理员
ExceptionTranslationFilter.insufficientAuthentication=token无效

 再加上全局异常处理:

之前的项目用的是SpringSecurity oauth2,这个办法只对oauth2有用 

3,还有几篇文章说的在

@Override
protected void configure(HttpSecurity http) throws Exception{}里面配置重定向到自定义的一个接口,然后在controller层处理掉这些错误,我试了也不行

4,还有监听session过期什么什么很多方法不一一列举了,下面是我的处理办法:

我首先在IDEA里面ctrl+shift+F搜索这个Access Denied到底是哪里返回的,然后发现了这个

 看到没有,这个错误是直接在response里面写回去了,所以任何异常处理都不管用了,找到来源,然后点Http403ForbiddenEntryPoint

然后发现这个东西,有点像security的异常处理

进去之后看到这里直接return了一个Http403ForbiddenEntryPoint

点击这个方法,看看哪里在调用,发现就是上面的一个AuthenticationEntryPoint getAuthenticationEntryPoint(H http)方法

看到没,这里有个条件,entryPoint为空,就要执行这个方法,然后看看authenticationEntryPoint在哪里注入的,

 这个方法返回的是ExceptionHandlingConfigurer,这个在HttpSecurity类里面我好像看到过,然后回到securityconfig配置类里面,果然发现了,看到没,这里可以配置

 然后new 一个类实现接口AuthenticationEntryPoint

@Slf4j
public class AccessDeniedHandler implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
                         AuthenticationException authException) throws IOException, ServletException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        PrintWriter out = response.getWriter();
        out.write(JSON.toJSONString(ResultVO.fail("无权访问")));
    }
}

然后继续在securityconfig配置类里面注入一个bean

就这样就可以了,然后重新swagger访问试试已经是刚刚修改的提示了,希望对你有帮助,有问题可以留言交流 

 

发布了24 篇原创文章 · 获赞 35 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_27948811/article/details/89945940