个性化token 背景

上一篇文章《Spring Security OAuth 个性化token(一)》有提到,oauth2.0 接口默认返回的报文格式如下:

  1. {
  2.     "access_token": "e6669cdf-b6cd-43fe-af5c-f91a65041382",
  3.     "token_type": "bearer",
  4.     "refresh_token": "da91294d-446c-4a89-bdcf-88aee15a75e8",
  5.     "expires_in": 43199, 
  6.     "scope": "server"
  7. }

通过上篇文章我们已经可以扩展增加部分业务字段。

  1. {
  2.     "access_token":"a6f3b6d6-93e6-4eb8-a97d-3ae72240a7b0",
  3.     "token_type":"bearer",
  4.     "refresh_token":"710ab162-a482-41cd-8bad-26456af38e4f",
  5.     "expires_in":42396,
  6.     "scope":"server",
  7.     "tenant_id":1,
  8.     "license":"made by pigx",
  9.     "dept_id":1,
  10.     "user_id":1,
  11.     "username":"admin"
  12. }

「在一些场景下我们需要自定义一下返回报文的格式,例如pig 使用R 对象返回,全部包含code业务码信息」

  1. {
  2.     "code":1,
  3.     "msg":"",
  4.     "data":{
  5.         "access_token":"e6669cdf-b6cd-43fe-af5c-f91a65041382",
  6.         "token_type":"bearer",
  7.         "refresh_token":"da91294d-446c-4a89-bdcf-88aee15a75e8",
  8.         "expires_in":43199,
  9.         "scope":"server"
  10.     }
  11. }

方法一:HandlerMethodReturnValueHandler

  • 顾名思义这是 Spring MVC 提供给我们修改方法返回值的接口
  1. public class FormatterToken implements HandlerMethodReturnValueHandler {
  2.  private static final String POST_ACCESS_TOKEN = "postAccessToken";
  3.  @Override
  4.  public boolean supportsReturnType(MethodParameter returnType) {
  5.      // 判断方法名是否是 oauth2 的token 接口,是就处理
  6.   return POST_ACCESS_TOKEN.equals(Objects
  7.     .requireNonNull(returnType.getMethod()).getName());
  8.  }
  9.   
  10.   // 获取到返回值然后使用 R对象统一包装
  11.  @Override
  12.  public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer container, NativeWebRequest request) throws Exception {
  13.   ResponseEntity<OAuth2AccessToken> responseEntity = (ResponseEntity) returnValue;
  14.   OAuth2AccessToken body = responseEntity.getBody();
  15.   HttpServletResponse response = request.getNativeResponse(HttpServletResponse.class);
  16.   assert response != null;
  17.   WebUtils.renderJson(response, R.ok(body));
  18.  }
  19. }
  • 注入FormatterToken,一定要这么处理,不要直接使用 MVCconfig 注入,保证此Handler比 SpringMVC 默认的提前执行。
  1. public class FormatterTokenAutoConfiguration implements ApplicationContextAware, InitializingBean {
  2.  private ApplicationContext applicationContext;
  3.  @Override
  4.  public void afterPropertiesSet() {
  5.   RequestMappingHandlerAdapter handlerAdapter = applicationContext.getBean(RequestMappingHandlerAdapter.class);
  6.   List<HandlerMethodReturnValueHandler> returnValueHandlers = handlerAdapter.getReturnValueHandlers();
  7.   List<HandlerMethodReturnValueHandler> newHandlers = new ArrayList<>();
  8.   newHandlers.add(new FormatterToken());
  9.   assert returnValueHandlers != null;
  10.   newHandlers.addAll(returnValueHandlers);
  11.   handlerAdapter.setReturnValueHandlers(newHandlers);
  12.  }
  13.  @Override
  14.  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  15.   this.applicationContext = applicationContext;
  16.  }
  17. }

方法二:aop 拦截增强 /oauth/token 接口

  1. @Around("execution(* org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.postAccessToken(..))")
  2. public Object handlePostAccessTokenMethod(ProceedingJoinPoint joinPoint) throws Throwable {
  3.    // 获取原有值,进行包装返回
  4.       Object proceed = joinPoint.proceed();
  5.       ResponseEntity<OAuth2AccessToken> responseEntity = (ResponseEntity<OAuth2AccessToken>) proceed;
  6.         OAuth2AccessToken body = responseEntity.getBody();
  7.         return ResponseEntity
  8.                   .status(HttpStatus.OK)
  9.                   .body(R.ok(body));
  10.         }
  11. }

总结

实际项目中不建议修改此接口的访问格式,不兼容oauth2协议 导致其他组件不能正常使用 例如

  • swagger 自带的认证授权

  • 其他网关组件自带的oauth2

https://docs.konghq.com/hub/kong-inc/oauth2/

  • spring security oauth2 自带的 sso 功能

都将失效总体来权衡 弊大于利

项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注

Spring Security OAuth 格式化 token 输出的更多相关文章

  1. Spring Security OAuth 个性化token

    个性化Token 目的 默认通过调用 /oauth/token 返回的报文格式包含以下参数 { "access_token": "e6669cdf-b6cd-43fe-a ...

  2. Spring Security OAuth 2.0

    续·前一篇<OAuth 2.0> OAuth 2.0 Provider 实现 在OAuth 2.0中,provider角色事实上是把授权服务和资源服务分开,有时候它们也可能在同一个应用中, ...

  3. Spring Security + OAuth系统环境搭建(一)

    最近在做权限管理系统的重构工作,系统基于Spring Security + OAuth架构,整体架构.技术和之前调研的结果差不多,架构调研时有在这篇博客做过简单记录“Spring Cloud微服务下的 ...

  4. Spring Security OAuth笔记

    因为工作需要,系统权限安全方面可能要用到Spring Security OAuth2.0,所以,近几天了解了一下OAuth相关的东西.目前好像还没有系统的学习资料,学习主要是通过博客,内容都是大同小异 ...

  5. Spring Security OAuth 2开发者指南译

    Spring Security OAuth 2开发者指南译 介绍 这是用户指南的支持OAuth 2.0.对于OAuth 1.0,一切都是不同的,所以看到它的用户指南. 本用户指南分为两部分,第一部分为 ...

  6. 使用Redis作为Spring Security OAuth2的token存储

    写在前边 本文对Spring Security OAuth2的token使用Redis保存,相比JWT实现的token存储,Redis可以随时吊销access_token,并且Redis响应速度很快, ...

  7. 【微服务】 数据库案例理解Spring Security OAuth

    突然被问,你是做技术的怎么不走技术路线呢?是啊~仔细想想至今做了这么多年的技术,研发过的系统&产品五花八门,涉及到的领域各行各业:政府.军队.公安.国安.石油&石化.金融.教育.华为等 ...

  8. Spring Security OAuth 笔记

    1  单点登录 关于单点登录的原理,我觉得下面这位老哥讲的比较清楚,有兴趣可以看一下,下面我把其中的重点在此做个笔记总结 https://juejin.cn/post/6844904079274197 ...

  9. Spring Security OAuth正式终止维护,已从官网下架

    Spring Security团队正式宣布Spring Security OAuth终止维护. 目前官网的主页已经高亮提醒彻底停止维护. 旧的Spring Security OAuth项目终止到2.5 ...

随机推荐

  1. React 函数式组件的 Ref 和子组件访问(useImperativeHandle)

    引入:如何调用函数式组件内部的方法 对于 React 中需要强制修改子组件的情况,React 提供了 Refs 这种解决办法,使得我们可以操作底层 DOM 元素或者自定的 class 组件实例.除此之 ...

  2. iOS拍个小视频

    需求 公司混合开发,uni端拍小视频不是很理想,为达到仿微信效果,原生插件走起 思路 第1步:1个AVCaptureSession, 1块AVCaptureVideoPreviewLayer[考虑兼容 ...

  3. Vue学习笔记-Windows系统Git安装(按装vue-element-admin报错)

    一  使用环境: windows 7 64位操作系统 二  Windows系统Git安装(Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理,是目前使用范围最广的版 ...

  4. 「TcaplusDB知识库」概念(表、键、记录、索引)

       TcaplusDB作为一款NoSQL数据库,语法与传统的SQL关系库有所差异.本文将详细介绍TcaplusDB表.记录.索引这三个数据库中常用术语在TcaplusDB中的概念与意义. 术语\概念 ...

  5. NodeJs 入门到放弃 — 入门基本介绍(一)

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14450905.html 目录 码文不易啊,转载请带上本文链接呀,感谢感谢 https ...

  6. GPU 总结

    What features of GPUs allow them to perform computations faster than a typical CPU? GPUs have a mass ...

  7. idea更改包名无法加载主类解决

    把工程下面的.idea目录下的workspace.xml里面的路径改成你最新的路径即可. <option name="SPRING_BOOT_MAIN_CLASS" valu ...

  8. 由endl对printf和cout的思考

    [前言]二者的区别就不介绍了.二者使用方法: printf("%s",a); cout<<a<<endl; endl的作用是什么? 一.endl作用 众所周 ...

  9. 后端程序员之路 57、go json

    go自带json处理库,位于encoding/json,里面的test很具参考意义,特别是example_test.go json - The Go Programming Languagehttps ...

  10. CentOS rpm常用功能记录

    CentOS7主要有rpm和yum这两种包软件的管理.两者有功能上的区别,其中主要区别是:yum使用简单但需要联网,yum会去网上包源去获取所需要的软件包.而rpm的需要做的事情就更细一些,比如我们需 ...