Spring Cloud OAuth2实现自定义token返回格式


Posted in Java/Android onJune 25, 2022

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

Spring Cloud OAuth2实现自定义token返回格式

今天这篇文章就来回答其中一个问题:如何自定义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
}

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

解决方案

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

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

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

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

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

@RequestMapping(value = "/oauth/token", method=RequestMethod.GET)
public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, @RequestParam
Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {}

@RequestMapping(value = "/oauth/token", method=RequestMethod.POST)
public ResponseEntity<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam
Map<String, String> 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<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam
            Map<String, String> 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<Map<String,?>> checkToken(@RequestParam("token") String value)  {
        Map<String, ?> map = checkTokenEndpoint.checkToken(value);
        return ResultMsg.resultSuccess(map);
    }

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

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

总结

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

以上就是Spring Cloud OAuth2实现自定义token返回格式的详细内容,更多关于Spring Cloud OAuth2的资料请关注三水点靠木其它相关文章!


Tags in this post...

Java/Android 相关文章推荐
SpringAop日志找不到方法的处理
Jun 21 Java/Android
Java 中的 Unsafe 魔法类的作用大全
Jun 26 Java/Android
Java基础之线程锁相关知识总结
Jun 30 Java/Android
java设计模式--七大原则详解
Jul 21 Java/Android
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
Sep 25 Java/Android
聊聊SpringBoot自动装配的魔力
Nov 17 Java/Android
Java实现给Word文件添加文字水印
Feb 15 Java/Android
Spring事务管理下synchronized锁失效问题的解决方法
Mar 31 Java/Android
详解Flutter自定义应用程序内键盘的实现方法
Jun 14 Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 Java/Android
spring 项目实现限流方法示例
Jul 15 Java/Android
JDK8中String的intern()方法实例详细解读
Sep 23 Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 #Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 #Java/Android
springboot创建的web项目整合Quartz框架的项目实践
Jun 21 #Java/Android
springboot读取resources下文件的方式详解
Jun 21 #Java/Android
java实现自定义时钟并实现走时功能
Jun 21 #Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 #Java/Android
Android基础入门之dataBinding的简单使用教程
Jun 21 #Java/Android
You might like
如何写php程序?
2006/12/08 PHP
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
PHP实现通过URL提取根域名
2016/03/31 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
动态调用CSS文件的JS代码
2010/07/29 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
JavaScript中Null与Undefined的区别解析
2015/06/30 Javascript
js实现简单秒表走动的时钟特效
2020/03/25 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
Python生成随机MAC地址
2015/03/10 Python
举例区分Python中的浅复制与深复制
2015/07/02 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
几个Linux面试题笔试题
2012/12/01 面试题
保安拾金不昧表扬信
2014/01/15 职场文书
自动一体化专业求职信
2014/03/15 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
反邪教学习心得体会
2016/01/15 职场文书
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫