个性化Token 目的
  
  默认通过调用 /oauth/token 返回的报文格式包含以下参数
  
  {
  
  "access_token": "e6669cdf-b6cd-43fe-af5c-f91a65041382",
  
  "token_type": "bearer",
  
  "refresh_token": "da91294d-446c-4a89-bdcf-88aee15a75e8",
  
  "expires_in": 43199,
  
  "scope": "server"
  
  }
  
  并没包含用户的业务信息比如用户信息、租户信息等。
  
  扩展生成包含业务信息(如下),避免系统多次调用,直接可以通过认证接口获取到用户信息等,大大提高系统性能
  
  {
  
  "access_token":"a6f3b6d6-93e6-4eb8-a97d-3ae72240a7b0",
  
  "token_type":"bearer",
  
  "refresh_token":"710ab162-a482-41cd-8bad-26456af38e4f",
  
  "expires_in":42396,
  
  "scope":"server",
  
  "tenant_id":1,
  
  "license":"made by pigx",
  
  "dept_id":1,
  
  "user_id":1,
  
  "username":"admin"
  
  }
  
  密码模式生成Token 源码解析
  
  image
  
  ​ 主页参考红框部分
  
  ResourceOwnerPasswordTokenGranter (密码模式)根据用户的请求信息,进行认证得到当前用户上下文信息
  
  protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) {
  
  Map<String, String> parameters = new LinkedHashMap<String, String>(tokenRequest.getRequestParameters());
  
  String username = parameters.get("username");
  
  String password = parameters.get("password");
  
  // Protect from downstream leaks of password
  
  parameters.remove("password");
  
  Authentication userAuth = new UsernamePasswordAuthenticationToken(username, password);
  
  ((AbstractAuthenticationToken) userAuth).setDetails(parameters);
  
  userAuth = authenticationManager.authenticate(www.yinxionghui1.com/ userAuth);
  
  OAuth2Request storedOAuth2Request = getRequestFactory().createOAuth2Request(client, tokenRequest);
  
  return new OAuth2Authentication(storedOAuth2Request, userAuth);
  
  }
  
  然后调用AbstractTokenGranter.getAccessToken() 获取OAuth2AccessToken
  
  protected OAuth2AccessToken getAccessToken(ClientDetails client, TokenRequest tokenRequest) {
  
  return tokenServices.createAccessToken(getOAuth2Authentication(client, tokenRequest));
  
  }
  
  默认使用DefaultTokenServices来获取token
  
  public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException {
  
  ... 一系列判断 ,合法性、是否过期等判断
  
  OAuth2AccessToken accessToken = createAccessToken(authentication, refreshToken);
  
  tokenStore.storeAccessToken(accessToken,www.dasheng178.com authentication);
  
  // In case it was modified
  
  refreshToken = accessToken.getRefreshToken();
  
  if (refreshToken != null) {
  
  tokenStore.storeRefreshToken(refreshToken, authentication);
  
  }
  
  return accessToken;
  
  }
  
  createAccessToken 核心逻辑
  
  // 默认刷新token 的有效期
  
  private int refreshTokenValiditySeconds = 60 * 60 * 24 * 30; // default 30 days.
  
  // 默认token 的有效期
  
  private int accessTokenValiditySeconds = 60 * 60 * 12; // default 12 hours.
  
  private OAuth2AccessToken createAccessToken(www.michenggw.com OAuth2Authentication authentication, OAuth2RefreshToken refreshToken) {
  
  DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(uuid);
  
  token.setExpiration(Date)
  
  token.setRefreshToken(refreshToken);
  
  token.setScope(authentication.getOAuth2Request(www.tianshengyuLe1.cn).getScope());
  
  return accessTokenEnhancer != null ? accessTokenEnhancer.enhance(token, authentication) : token;
  
  }
  
  如上代码,在拼装好token对象后会调用认证服务器配置TokenEnhancer( 增强器) 来对默认的token进行增强。
  
  TokenEnhancer.enhance 通过上下文中的用户信息来个性化Token
  
  public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
  
  final Map<String, Object> additionalInfo = new HashMap<www.zhongxinyul2.com>(8);
  
  PigxUser pigxUser =www.yongshi123.cn (PigxUser) authentication.getUserAuthentication().getPrincipal();
  
  additionalInfo.put("user_id", pigxUser.getId());
  
  additionalInfo.put("username", pigxUser.getUsername());
  
  additionalInfo.put("dept_id", pigxUser.getDeptId());
  
  additionalInfo.put("tenant_id", pigxUser.getTenantId());
  
  additionalInfo.put("license", SecurityConstants.PIGX_LICENSE);
  
  ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
  
  return accessToken;
  
  }
  
  基于pig 看下最终的实现效果
  
  Pig 基于Spring Cloud、oAuth2.0开发基于Vue前后分离的开发平台,支持账号、短信、SSO等多种登录,提供配套视频开发教程。

Spring Security OAuth 个性化token的更多相关文章

  1. Spring Security OAuth 格式化 token 输出

    个性化token 背景 上一篇文章<Spring Security OAuth 个性化token(一)>有提到,oauth2.0 接口默认返回的报文格式如下: {     "ac ...

  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. sql server sql查询数据库的表,字段,主键,自增,字段类型等信息

    1.查询数据表的属性(名称.说明.是否主键.数据类型.是否自增) SELECT t1.name columnName,case when t4.id is null then 'false' else ...

  2. 测试目录结构Aegisub【自用笔记】

    手册链接https://aegi.vmoe.info/docs/3.2/Main_Page/ 01,加粗   b标签 1开启 其他或不写则关闭 买{\b1}苹果{\b0}123 02,倾斜   i标签 ...

  3. RAID卡的结构详解

    软件RAID的缺点如此之多,使人们不断地思考更多实现RAID的方法.既然软件缺点太多,那么用硬件实现如何呢? RAID卡就是一种利用独立硬件来实现RAID功能的方法.要在硬件上实现RAID功能,必须找 ...

  4. GlusterFS分布式存储集群-1. 部署

    参考文档: Quick Start Guide:http://gluster.readthedocs.io/en/latest/Quick-Start-Guide/Quickstart/ Instal ...

  5. 深入理解List集合框架底层原理的实现

    前言: 此篇文章讲解ArrayList和LinkedList底层实现原理.for和foreach遍历集合哪个效率会更高一些! 讲讲什么是集合框架?集合框架是为表示和操作集合而规定的一种统一的标准的体系 ...

  6. 亚马逊的客户服务和承诺 - Delay in shipping your Amazon.com order - Missed Fulfillment Promise

    We encountered a delay in shipping your order. We apologize for the inconvenience. Since your packag ...

  7. 11.15 Daily Scrum

    今天是假期回来的第一个周末,也是我们团队的又一次进度汇总总结和调试工作开展,鉴于一周以来大家的工作有了很大的成果,所以,本次召开的会议主旨在于解决一些开发方面的细节问题,达成共识,为日后进一步的功能方 ...

  8. 20172329 2018-2019 《Java软件结构与数据结构》实验三报告

    20172329 2018-2019-2 <Java软件结构与数据结构>实验三报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 王文彬 学号:2017232 ...

  9. 软件团队项目第一次Sprint评价(评价人:张家军)

    组号                      组名 缺点及建议                   1 理财猫 (1)没有附带的计算器 (2)支入支出没有详细菜单说明 (3)界面背景单调       ...

  10. 剑指offer :从尾到头打印链表

    题目描述: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路: 链表的遍历只能从头向尾进行,要从尾到头输出,考虑用栈.先从头到尾遍历一次链表,同时将值进栈,再清空栈,同时将值 ...