您现在的位置是:亿华云 > 知识
一个接口优雅的实现 Spring Cloud OAuth2 自定义token返回格式
亿华云2025-10-05 23:28:53【知识】3人已围观
简介今天这篇文章就来回答其中一个问题:如何自定义token的返回格式?本篇文章对应视频,介绍更加详细:问题描述Spring Security OAuth的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
Map
@RequestMapping(value = "/oauth/token", method=RequestMethod.POST)
public ResponseEntity
可以看到针对这个接口定义了两个,一个是雅的服务器托管义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
Map
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
return ResultMsg.resultSuccess(map);
}这种方式是不是很优雅?也很符合Spring Security的设计思想,AOP的方式还要对参数解析,重新包装
好了,关于测试的话自己搞一搞。
总结本篇文章介绍了认证服务中对token的返回格式自定义,总的来说还是比较简单的,有兴趣的也可以去网上找找关于AOP的方式。
很赞哦!(421)
相关文章
- 2. 不要花大价钱买域名,新手鉴别能力不足,容易投资失误。
- 不同编程语言在发生stackoverflow之前支持的调用栈最大嵌套层数
- 分布式 PostgreSQL之Citus 架构
- 为什么数据库连接很消耗资源?
- 公司名字不但要与其经营理念、活动识别相统一,还要能反映公司理念,服务宗旨、商品形象,从而才能使人看到或听到公司的名称就能产生愉快的联想,对商店产生好感。这样有助于公司树立良好的形象。
- 云战争,数据仓库是必过的一道坎
- 不务正业,捣鼓了一个破网站,全过程记录
- 日常工作中,Python+Pandas是否能代替Excel+VBA?
- 在此期间,他们每天仍在这里卖大米,在理财方面个人感情有待提高。因为现在是收米的最佳时机。
- Java 虚拟机之一:Java 技术体系与平台
站长推荐
2、根据用户基础选择访问提供程序。由于互联问题的存在,接入商的选择也非常重要,如果用户群主要在联通,尽量选择联通接入较好的接入商,如果用户群主要在电信,那么选择电信接入较好的接入商。如果用户组位于国家/地区,则选择更好的访问提供程序进行交互。
百度高权重域名购买要注意什么?
慢查询导致 MySQL 雪崩,危险可能不止于此……
Spark SQL 字段血缘在 vivo 互联网的实践
并非一个好米任何人都会给你一个好的价格。那你该如何用以有的好米卖出最理想的价格呢?
聊聊数据存储系统Couchbase与Redis
15个必知的 MySQL 索引失效场景,别再踩坑了!
再有人问你为什么MySQL用B+树做索引,就把这篇文章发给她