大家好,我是不才陈某~
最近读者朋友针对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 } 复制代码
那么如何去对默认的格式进行修改呢?
文章插图
解决方案
其实解决方案还是很多的,据陈某了解有如下两种解决方案:
- 使用AOP的方式对/oauth/token这个接口的结果拦截修改
- 重定义接口覆盖默认的
第一种方案呢可以实现,但是对于陈某来说不够优雅,实现比较简单,不显逼格
于是陈某今天介绍第二种方案,一种比较优雅的方式;想要理解第二种方式必须对Spring Security的底层源码有一些了解 。
/OAuth/token这个接口定义在哪里呢?通过源码我们知道定义在org.springframework.security.oauth2.provider.endpoint.TokenEndpoint中,如下:
@RequestMApping(value = https://www.isolves.com/it/cxkf/kj/2023-01-09/"/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 = https://www.isolves.com/it/cxkf/kj/2023-01-09/"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 = https://www.isolves.com/it/cxkf/kj/2023-01-09/"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); } 复制代码
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 如何一个月瘦大腿(一个月瘦腿的最快方法)
- 如何一个月瘦20斤(虚胖体质怎么减肥最快)
- 如何一个月瘦10斤(如何在半个月内瘦20斤)
- 女生如何接吻(有多喜欢才想亲一个人)
- mini usb接口
- 洪欣|张兰洪欣,2个家庭都被爆出收款人事件,一个未回应一个选择沉默
- 增生疤痕如何去除(去除疤痕要多少钱)
- 叶童|叶童赵雅芝现状,一个头发花白无惧年龄,一个强凹人设不再优雅
- 肖战|汪海林再次点名肖战,称在演一个“随时被删的角色”,网友:无语
- 国家级刊物有哪些(国家级期刊)