个性化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. Arthas Alibaba 开源 Java 诊断工具

    Arthas 用户文档 English Docs Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,A ...

  2. Spring学习(4)IOC容器配置bean:定义与实例化

    一.  IOC容器配置 1. 一些概念 (1)IOC容器: 定义:具有管理对象和管理对象之间的依赖关系的容器. 作用:应用程序无需自己创建对象,对象由IOC容器创建并组装.BeanFactory是IO ...

  3. 高可用OpenStack(Queen版)集群-1. 集群环境

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  4. Gaussian Models

    Warming Up Before we talk about multivariate Gaussian, let's first review univariate Gaussian, which ...

  5. virtual box下安装ubuntu经验

    1. 哪怕下载的是ubuntu64位版本,也在vitualbox下选择ubuntu而不要选择ubuntu(64bit) 2. 安装VBoxGuestAdditional.iso:下载和vbox版本相匹 ...

  6. Windows搭建python开发环境

    python你不去认识它,可能没什么,一旦你认识了它,你就会爱上它 基本概念Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum ...

  7. java.util.ConcurrentModificationException: null

    是因为在map.foreach中又put新的值了 在map.foreach中可能是不可以增删改

  8. Scrum Meeting 8 -2014.11.14

    给开发加了个pdf信息提取优化任务. 弄了半天发现服务器也是个好东西.这周末可以和爬虫讨论整合的问题了. Member Today’s task Next task 林豪森 协助测试及服务器部署 协助 ...

  9. 关于Target=" "的一些属性

    总结目前所知的Target=""的几个属性,对其它博客进行整理和归纳. Target="_blank":浏览器总在一个新打开.未命名的窗口中载入目标文档. 说通 ...

  10. keras+theano+tensorflow+darknet

    keras 安装: 最好在anaconda的虚拟环境下搭建: conda create -n 环境名 python=3.6 进入环境: source activate 环境名 安装keras: pip ...