点击上方 "编程技术圈"关注, 星标或置顶一起成长

Spring Cloud:Security OAuth2 自定义异常响应_Spring Cloud

后台回复“大礼包”有惊喜礼包!

每日英文

Don’t take people’s care for granted. No matter how much they love you, people get tired eventually. 

不要把别人的关心当成理所当然。不管他有多爱你,最终也会有疲惫的一天。

每日掏心话

成熟的爱是倚靠不是倚赖,倚靠是在你偶尔疲倦的时候可以靠一下,休息一下,倚赖则是赖着不走了。

来自:BNDong | 责编:乐乐

链接:cnblogs.com/bndong/p/10275430.html

编程技术圈(ID:study_tech)第 1110 次推文

往日回顾:腾讯万字Code Review规范出炉!别再乱写代码了

     

   正文   

对于客户端开发或者网站开发而言,调用接口返回有统一的响应体,可以针对性的设计界面,代码结构更加清晰,层次也更加分明。
默认异常响应

在使用 Spring Security Oauth2 登录和鉴权失败时,默认返回的异常信息如下:

{
  "error": "unauthorized",
  "error_description": "Full authentication is required to access this resource"
}

这与我们返回的信息格式不一致。如果需要修改这种返回的格式,需要重写相关异常处理类。这里我统一的是资源服务器(网关)的响应格式。

自定义异常响应

无效 token 异常类重写

新增 AuthExceptionEntryPoint.java

@Component
public class AuthExceptionEntryPoint implements AuthenticationEntryPoint
{

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
                         AuthenticationException authException) throws ServletException {
        Map<String, Object> map = new HashMap<String, Object>();
        Throwable cause = authException.getCause();

        response.setStatus(HttpStatus.OK.value());
        response.setHeader("Content-Type", "application/json;charset=UTF-8");
        try {
            if(cause instanceof InvalidTokenException) {
                response.getWriter().write(ResultJsonUtil.build(
                        ResponseCodeConstant.REQUEST_FAILED,
                        ResponseStatusCodeConstant.OAUTH_TOKEN_FAILURE,
                        ResponseMessageConstant.OAUTH_TOKEN_ILLEGAL
                ));
            }else{
                response.getWriter().write(ResultJsonUtil.build(
                        ResponseCodeConstant.REQUEST_FAILED,
                        ResponseStatusCodeConstant.OAUTH_TOKEN_MISSING,
                        ResponseMessageConstant.OAUTH_TOKEN_MISSING
                ));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

权限不足异常类重写

新增 CustomAccessDeniedHandler.java

在公众号顶级架构师回复“架构整洁”,获取惊喜礼包。

@Component("customAccessDeniedHandler")
public class CustomAccessDeniedHandler implements AccessDeniedHandler {

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response,
                       AccessDeniedException accessDeniedException)
            throws IOException, ServletException {
        response.setStatus(HttpStatus.OK.value());
        response.setHeader("Content-Type", "application/json;charset=UTF-8");
        try {
            response.getWriter().write(ResultJsonUtil.build(
                    ResponseCodeConstant.REQUEST_FAILED,
                    ResponseStatusCodeConstant.OAUTH_TOKEN_DENIED,
                    ResponseMessageConstant.OAUTH_TOKEN_DENIED
            ));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

资源配置类中设置异常处理类

修改资源配置类 ResourceServerConfiguration.java

@Override
public void configure(ResourceServerSecurityConfigurer resources) {
    resources.tokenExtractor(customTokenExtractor);
    resources.authenticationEntryPoint(authExceptionEntryPoint)
            .accessDeniedHandler(customAccessDeniedHandler);
}

自定义响应测试

Spring Cloud:Security OAuth2 自定义异常响应_Java_02Spring Cloud:Security OAuth2 自定义异常响应_Java_03

「示例代码」

https://github.com/BNDong/spring-cloud-examples/tree/master/spring-cloud-zuul/cloud-zuul


PS:
欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

欢迎加入后端架构师交流群,在后台回复“学习”即可。

Spring Cloud:Security OAuth2 自定义异常响应_Java_04

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

Java 项目权威排名:Nacos 未上版,Gradle 排名第二,Maven 排名 28

p0级重大事故:超卖了100瓶飞天茅台,整个项目组慌得一逼~

心痛!拼多多23岁女员工加班回家路上猝死,官方回复,网友怒了!遭知乎官方打脸!

BAT等大厂Java面试经验总结

Spring Cloud:Security OAuth2 自定义异常响应_Java_05

别找了,想获取 Java大厂面试题学习资料

扫下方二维码回复「手册」就好了



嘿,你在看吗Spring Cloud:Security OAuth2 自定义异常响应_Java_06