您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

一个接口优雅的实现 Spring Cloud OAuth2 自定义token返回格式

时间:2023-01-07 11:18:36  来源:今日头条  作者:Java架构嘻嘻嘻

大家好,我是不才陈某~

最近读者朋友针对Spring Security oauth2.0 想要陈某补充一些知识,如下:


 

今天这篇文章就来回答其中一个问题:如何自定义token的返回格式?

问题描述

Spring Security OAuth的token返回格式都是默认的,但是往往这个格式是不适配系统,/oauth/token返回的格式如下:

{ "access_token": token "token_type": "bearer", "refresh_token": xxxx "expires_in": xxx, "scope": "xxx", "jti": xxxx .................... } 复制代码

然而此时系统中的统一返回格式为:

{ "code":xxx "data":xxx "msg":xxx } 复制代码

那么如何去对默认的格式进行修改呢?


 


解决方案

其实解决方案还是很多的,据陈某了解有如下两种解决方案:

 

  1. 使用AOP的方式对/oauth/token这个接口的结果拦截修改
  2. 重定义接口覆盖默认的

 

第一种方案呢可以实现,但是对于陈某来说不够优雅,实现比较简单,不显逼格

于是陈某今天介绍第二种方案,一种比较优雅的方式;想要理解第二种方式必须对Spring Security的底层源码有一些了解。

/OAuth/token这个接口定义在哪里呢?通过源码我们知道定义在org.springframework.security.oauth2.provider.endpoint.TokenEndpoint中,如下:

@RequestMApping(value = "/oauth/token", method=RequestMethod.GET) public ResponseEntity getAccessToken(Principal principal, @RequestParam Map parameters) throws HttpRequestMethodNotSupportedException {} @RequestMapping(value = "/oauth/token", method=RequestMethod.POST) public ResponseEntity postAccessToken(Principal principal, @RequestParam Map parameters) throws HttpRequestMethodNotSupportedException {} 复制代码

可以看到针对这个接口定义了两个,一个是GET请求、一个是POST请求

TokenEndpoint其实就是一个接口,使用注解@FrameworkEndpoint标注,这个注解和@Controller的作用一样,如下:

@FrameworkEndpoint public class TokenEndpoint extends AbstractEndpoint {} 复制代码

那么知道在哪里定义的就好办了,模仿着它这个接口自己重新定义一个覆盖掉不就好了,如下:

@Api(value = "OAuth接口") @RestController @RequestMapping("/oauth") @Slf4j public class AuthController implements InitializingBean { //令牌请求的端点 @Autowired private TokenEndpoint tokenEndpoint; //自定义异常翻译器,针对用户名、密码异常,授权类型不支持的异常进行处理 private OAuthServerWebResponseExceptionTranslator translate; /** * 重写/oauth/token这个默认接口,返回的数据格式统一 */ @PostMapping(value = "/token") public ResultMsg postAccessToken(Principal principal, @RequestParam Map parameters) throws HttpRequestMethodNotSupportedException { OAuth2AccessToken accessToken = tokenEndpoint.postAccessToken(principal, parameters).getBody(); return ResultMsg.resultSuccess(accessToken); } } 复制代码

可以看到接口内部不需要自己重写逻辑,只需要调用TokenEndpoint中的方法

 

注意:由于对TokenEndpoint中的端点重写了,因此前面定义的对用户名、密码之类的异常捕获的翻译类(OAuthServerWebResponseExceptionTranslator)将会失效,需要在全局异常中进行捕获

 

上面是/oauth/token的接口,/oauth/check_token这个校验token的接口如需自定义也是可以的,对应的类是org.springframework.security.oauth2.provider.endpoint.CheckTokenEndpoint

重写后代码如下:

@Api(value = "OAuth接口") @RestController @RequestMapping("/oauth") @Slf4j public class AuthController implements InitializingBean { @Autowired private CheckTokenEndpoint checkTokenEndpoint; //自定义异常翻译器,针对用户名、密码异常,授权类型不支持的异常进行处理 private OAuthServerWebResponseExceptionTranslator translate; /** * 重写/oauth/check_token这个默认接口,用于校验令牌,返回的数据格式统一 */ @PostMapping(value = "/check_token") public ResultMsg> checkToken(@RequestParam("token") String value) { Map map = checkTokenEndpoint.checkToken(value); return ResultMsg.resultSuccess(map); } 复制代码

这种方式是不是很优雅?也很符合Spring Security的设计思想,AOP的方式还要对参数解析,重新包装

好了,关于测试的话自己搞一搞

总结

本篇文章介绍了认证服务中对token的返回格式自定义,总的来说还是比较简单的,有兴趣的也可以去网上找找关于AOP的方式。

 

作者:码猿技术专栏 链接:https://juejin.cn/post/7112630697335980046


Tags:Spring   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
大家好,我是不才陈某~最近读者朋友针对Spring Security oauth2.0 想要陈某补充一些知识,如下: 今天这篇文章就来回答其中一个问题:如何自定义token的返回格式?问题描述Spring Se...【详细内容】
2023-01-07  Tags: Spring  点击:(0)  评论:(0)  加入收藏
SpringBoot检验注解@Null 限制只能为null@NotNull 限制必须不为null@NotEmpty 只作用于字符串类型,字符串不为空,并且长度不为0@NotBlank 只作用于字符串类型,字符串不为空,并且...【详细内容】
2022-12-29  Tags: Spring  点击:(14)  评论:(0)  加入收藏
作者:郭艳红 以下举例皆针对单例模式讨论图解参考 https://www.processon.com/view/link/60e3b0ae0e3e74200e2478ce1、Spring 如何创建Bean?对于单例Bean来说,在Spring容器整个...【详细内容】
2022-12-21  Tags: Spring  点击:(2)  评论:(0)  加入收藏
前言相信大家在网上冲浪都遇到过登录时输入图片验证码的情况,既然我们已经学习了 Spring Security,也上手实现过几个案例,那不妨来研究一下如何实现这一功能。首先需要明确的是...【详细内容】
2022-12-12  Tags: Spring  点击:(24)  评论:(0)  加入收藏
一、@EnableTransactionManagement工作原理开启Spring事务本质上就是增加了一个Advisor,但我们使用 @EnableTransactionManagement注解来开启Spring事务是,该注解代理的功能就...【详细内容】
2022-12-11  Tags: Spring  点击:(1)  评论:(0)  加入收藏
一、什么是AOP?Aspect Oriented Programing 面向切面编程,相比较 oop 面向对象编程来说,Aop关注的不再是程序代码中某个类,某些方法,而aop考虑的更多的是一种面到面的切入,即层与...【详细内容】
2022-12-10  Tags: Spring  点击:(38)  评论:(0)  加入收藏
这是个很尴尬的话题,为什么这么说呢?当我们在讨论卷和造轮子两个事情的时候,SpringBoot 的开发人员也正在做着同样的事情...回顾之前在 微服务-分布式链路 这篇文章中我介绍了...【详细内容】
2022-12-10  Tags: Spring  点击:(55)  评论:(0)  加入收藏
环境:SpringBoot2.4.12概述项目中开发的API接口,可能有些接口返回的字段信息不能以明文的形式传输,这时候我们该如何进行处理呢?以下给出3中方式: 数据库层面处理 在SQL查询的时...【详细内容】
2022-12-09  Tags: Spring  点击:(42)  评论:(0)  加入收藏
日常开发中,我们有时会使用SpringEvent对业务解耦,使我们的代码更加高内聚低耦合,不过如果对其运行原理不清楚,那么在使用的过程中,一不留神就会出现一些bug。今天我们回顾一下Sp...【详细内容】
2022-12-08  Tags: Spring  点击:(40)  评论:(0)  加入收藏
环境:Spring5.3.23概述通过Spring定义请求接口非常容器,通过几个注解就可以完成,如下:@RestController@RequestMapping("/demos")public class DemoController { @GetMapping("...【详细内容】
2022-12-05  Tags: Spring  点击:(41)  评论:(0)  加入收藏
▌简易百科推荐
大家好,我是不才陈某~最近读者朋友针对Spring Security oauth2.0 想要陈某补充一些知识,如下: 今天这篇文章就来回答其中一个问题:如何自定义token的返回格式?问题描述Spring Se...【详细内容】
2023-01-07  Java架构嘻嘻嘻  今日头条  Tags:Spring   点击:(0)  评论:(0)  加入收藏
在一些场景下,您的kubernetes集群已经搭建完成了,但是还需要修改一些核心组件的参数,如etcd、kube-apiserver、kube-scheduler、kube-controller-manager等。通过kubectl get p...【详细内容】
2023-01-04  shoothzj  今日头条  Tags:kubernetes   点击:(14)  评论:(0)  加入收藏
Pod 资源配置 实际上上面几个步骤就是影响一个 Pod 生命周期的大的部分,但是还有一些细节也会在 Pod 的启动过程进行设置,比如在容器启动之前还会为当前的容器设置分配的 CPU...【详细内容】
2022-12-26  kamactor  今日头条  Tags:K8S   点击:(16)  评论:(0)  加入收藏
本篇文章我们首先解析 SqlSessionFactory 的创建过程。1、实例代码在实例代码中,我们在测试类中写了一个 init() 方法,里面包括了 SqlSessionFactory 的构建,分为两步。第一步:...【详细内容】
2022-12-26  二哥学Java  今日头条  Tags:Mybatis   点击:(22)  评论:(0)  加入收藏
大家好,很高兴又见面了,我是"web 前端分享",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!女士们先生们,Qwik 作为新的 JS 框...【详细内容】
2022-12-25  web 前端分享  今日头条  Tags:JS 框架   点击:(27)  评论:(0)  加入收藏
作者:郭艳红 以下举例皆针对单例模式讨论图解参考 https://www.processon.com/view/link/60e3b0ae0e3e74200e2478ce1、Spring 如何创建Bean?对于单例Bean来说,在Spring容器整个...【详细内容】
2022-12-21  京东云企业管家    Tags:Spring   点击:(2)  评论:(0)  加入收藏
1.mybatis简介MyBatis是一个ORM工具,封装了JDBC的操作,简化业务编程;Mybatis在web工程中,与Spring集成,提供业务读写数据库的能力。2.使用步骤 1.引入依赖采用Maven包依赖管理,myb...【详细内容】
2022-12-20    今日头条  Tags:MyBatis   点击:(10)  评论:(0)  加入收藏
一、@EnableTransactionManagement工作原理开启Spring事务本质上就是增加了一个Advisor,但我们使用 @EnableTransactionManagement注解来开启Spring事务是,该注解代理的功能就...【详细内容】
2022-12-11  海强旅行    Tags:Spring   点击:(1)  评论:(0)  加入收藏
一飞开源,介绍创意、新奇、有趣、实用的免费开源应用、系统、软件、硬件及技术,一个探索、发现、分享、使用与互动交流的开源技术社区平台。致力于打造活力开源社区,共建开源新...【详细内容】
2022-12-10  一飞开源  今日头条  Tags:框架   点击:(21)  评论:(0)  加入收藏
企业越来越需要升级其应用程序和方法,以便为数百万人提供数字体验。一种这样的方法是无服务器。技术主管现在正在重新考虑他们的战略,以响应提高敏捷性和降低总运营开销和成...【详细内容】
2022-12-09  科技狠活与软件技术  今日头条  Tags:AWS   点击:(19)  评论:(0)  加入收藏
站内最新
站内热门
站内头条