一个接口优雅的实现 Spring Cloud OAuth2 自定义token返回格式
大家好,我是不才陈某~
陈某的《Spring Cloud Alibaba实战项目》 视频教程已经录完了,涉及到Alibaba的各种中间件实战,戳这里--->Spring Cloud Alibaba 实战 视频专栏 开放订阅~
最近订阅《Spring Cloud Alibaba 项目实战》的朋友针对Spring Security OAuth2.0 想要陈某补充一些知识,如下:
今天这篇文章就来回答其中一个问题:如何自定义token的返回格式?
问题描述
Spring Security OAuth的token返回格式都是默认的,但是往往这个格式是不适配系统,/oauth/token
返回的格式如下:
然而此时系统中的统一返回格式为:
那么如何去对默认的格式进行修改呢?
解决方案
其实解决方案还是很多的,据陈某了解有如下两种解决方案:
- 使用AOP的方式对
/oauth/token
这个接口的结果拦截修改 - 重定义接口覆盖默认的
第一种方案呢可以实现,但是对于陈某来说不够优雅,实现比较简单,不显逼格
于是陈某今天介绍第二种方案,一种比较优雅的方式;想要理解第二种方式必须对Spring Security的底层源码有一些了解。
/oauth/token
这个接口定义在哪里呢?通过源码我们知道定义在org.springframework.security.oauth2.provider.endpoint.TokenEndpoint
中,如下:
可以看到针对这个接口定义了两个,一个是GET请求、一个是POST请求
TokenEndpoint
其实就是一个接口,使用注解@FrameworkEndpoint
标注,这个注解和@Controller
的作用一样,如下:
那么知道在哪里定义的就好办了,模仿着它这个接口自己重新定义一个覆盖掉不就好了,如下:
可以看到接口内部不需要自己重写逻辑,只需要调用TokenEndpoint
中的方法
“
注意:由于对TokenEndpoint中的端点重写了,因此前面定义的对用户名、密码之类的异常捕获的翻译类(OAuthServerWebResponseExceptionTranslator)将会失效,需要在全局异常中进行捕获
”
上面是/oauth/token
的接口,/oauth/check_token
这个校验token的接口如需自定义也是可以的,对应的类是org.springframework.security.oauth2.provider.endpoint.CheckTokenEndpoint
重写后代码如下:
这种方式是不是很优雅?也很符合Spring Security的设计思想,AOP的方式还要对参数解析,重新包装
好了,关于测试的话自己搞一搞
总结
本篇文章介绍了认证服务中对token的返回格式自定义,总的来说还是比较简单的,有兴趣的也可以去网上找找关于AOP的方式。
文章转载自公众号:码猿技术专栏
有没有优雅解决spring authorization server的/oauth2/token接口的?我要像你这样自定义。