在上一篇Spring Security Oauth2 中实现TokenEnhancer向jwt中添加额外信息中,笔者向大家介绍了如何向jwt中存额外信息(extraInfo) 接下来这篇blog,笔者将和大家一起探讨如何在后代获取这些extraInfo,希望对各位有帮助,如有不正确的地方,请大家指出。
先在access_token中加入这个两个字段message和name;

((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);

由上面的代码,可知我们在程序中是将额外信息添加到 DefaultOAuth2AccessToken的additionalInformation 中,当然我们取出来的时候,要找到access_token再从中取出来。具体代码如下:

 public Map<String, Object> getExtraInfo(OAuth2Authentication auth) {OAuth2AuthenticationDetails details= (OAuth2AuthenticationDetails) auth.getDetails();OAuth2AccessToken accessToken = tokenStore.readAccessToken(details.getTokenValue());return accessToken.getAdditionalInformation();}

其中readAccessToken 方法是将jwt那串很长的字符串读出来。
我们这里的资源服务器和认证服务器是分离的,所以tokenStore要重新配置一下 和 我们在认证服务器中配置一样,代码如下:

 @Overridepublic void configure(ResourceServerSecurityConfigurer config) {config.tokenServices(tokenServices());}@Beanpublic TokenStore tokenStore() {return new JwtTokenStore(accessTokenConverter());}@Beanpublic JwtAccessTokenConverter accessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();converter.setSigningKey("signing_key");return converter;}@Bean@Primarypublic DefaultTokenServices tokenServices() {DefaultTokenServices defaultTokenServices = new DefaultTokenServices();defaultTokenServices.setTokenStore(tokenStore());return defaultTokenServices;}

注意converter.setSigningKey(“signing_key”); 此处的signing_key需要和认证服务器中设定的一致,我们debug走一下。

让我们来看看控制输出了什么:

可以清楚的看到控制台打印出来的name和message。
从上面的代码可以知道,我们需要从tokenValue中解析出来,这样其实开发时候很麻烦,如果直接
从OAuth2Authentication中取出来就比较好,那我们该怎么做呢?这里spring security oauth2的设计者早就为我们预留了一个字段,还记得上面的那个decodedDetails的字段吗,它是null。那我们何不利用一下?将我们跟程序业务相关的信息存进去,取出来就直接get几下就行了,而且debug的时候也能很清楚的看到每个key-value,那怎么实现呢?代码如下:
首先,在资源服务器中自定义一个 访问令牌转换器 CustomAccessTokenConverter,然后将这个CustomAccessTokenConverter添加到ResourceServerConfigurer中。

/*** @author Cheng Jun* @version 1.0* @Description: 定制 AccessToken 转换器,为添加额外信息在服务器端获取做准备* @date 2018/12/24 16:05*/
@Component
public class CustomAccessTokenConverter extends DefaultAccessTokenConverter {@Overridepublic OAuth2Authentication extractAuthentication(Map<String, ?> claims) {OAuth2Authentication authentication= super.extractAuthentication(claims);authentication.setDetails(claims);return authentication;}
}


让我们再来重启一下项目,看看结果如何。

这里的decodedDetails已经是我们想要的结果了。

如果此文对你在使用spring security oauth2 中有什么帮助的话,笔者深感欣慰!点赞关注走一走呀,下面的二维码是笔者创建的一个spring security oauth2的qq群,欢迎加群讨论!

Spring Security Oauth2 在资源服务器如何获取jwt中的额外信息相关推荐

  1. Spring Security oAuth2创建认证服务器模块

    POM <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...

  2. Spring Security Oauth2 (五) 密码码模式 整合jwt

  3. Spring Security OAuth2 带有用于代码交换的证明密钥 (PKCE) 的授权码流

    Spring Security OAuth2 带有用于代码交换的证明密钥 (PKCE) 的授权码流 概述 OAuth2依据是否能持有客户端密钥,将客户端分为两种类型:公共客户端和保密客户端. 保密客户 ...

  4. SpringSecurity(二十)---OAuth2:实现资源服务器(上)资源服务器搭建以及直接调用授权服务器模式

    一. 前言 本章将讨论如何使用Spring Security实现一个资源服务器,资源服务器是管理用户资源的组件.另外,学习本章有个前提,需要先把前面搭建授权服务器的相关文章先给阅读,否则可能后面出现的 ...

  5. 使用Spring Security Oauth2 和 JWT保护微服务--资源服务器的编写

    编写hcnet-website的资源服务 依赖管理pom文件 hcnet-website工程的pom文件继承主maven的pom文件.在hcnet-website工程的pom文件中添加web功能的起步 ...

  6. 从零开始超详细的Spring Security OAuth2.0实现分布式系统授权(注册中心+网关+认证授权服务(JWT令牌验证)+资源调用服务)

    文章目录 一.OAuth2.0 1.介绍 2.例子 3.执行流程 二.Spring Cloud Security OAuth2 1.环境介绍 2.认证流程 三.整合分布式项目 1.技术方案 2.项目结 ...

  7. 使用Spring Security Oauth2 和 JWT保护微服务--Uaa授权服务器的编写

    学习自深入理解微服务 采用Spring Security OAuth2 和 JWT的方式,Uaa服务只需要验证一次,返回JWT.返回的JWT包含了用户的所有信息,包括权限信息 从三个方面讲解: JWT ...

  8. spring security oauth2 授权服务器负载均衡解决方案

    研究了好几天的授权服务对资源服务是如何实现负载均衡的 真的是丈二和尚摸不着头脑,研究了几天今天终于找到了一篇文章 真的是翻:烂了 奈何自己太菜 上一下资源服务的yml配置(oauth-server是注 ...

  9. Spring Security OAuth2 Demo -- good

    1. 添加依赖 授权服务是基于Spring Security的,因此需要在项目中引入两个依赖: <dependency><groupId>org.springframework ...

最新文章

  1. 【神仙题】【P4885】 灭顶之灾
  2. python的上下文管理
  3. 设置nginx 防止上传恶意脚本
  4. 汇编语言实现计算器---可加减乘除括号负数混合运算
  5. Java 7 –反编译项目硬币
  6. OpenVINO 2019 R2.0 Custom Layer Implementation for linux(2)
  7. jenkins 全局工具配置
  8. 新兴视频处理工具VapourSynth压制教程
  9. 从Multisim入门Altium Designer
  10. 服务器虚拟机迁移的6个步骤,KVM 虚拟机迁移(示例代码)
  11. 电路串联和并联图解_串联电路与并联电路的区别
  12. 2022熔化焊接与热切割复训题库模拟考试平台操作
  13. c软件查表获得电量代码_energy.c 源代码在线查看 - 基于单片机的多费率电能表源程序 资源下载 虫虫电子下载站...
  14. 麻省理工学院公开课:计算机科学及编程导论 课堂笔记
  15. GB2312编码范围
  16. 以为精通Java 线程池,看到这些误区,还是年轻了
  17. 图文讲解 WiFi 驱动移植过程,很肝~
  18. python怎么设置随机数种子_python实验随机种子的设置
  19. PostgreSQL数据库统计信息——analyze执行函数
  20. 利用Sort_1000pics数据集实现图像分类

热门文章

  1. 荐书《遗留系统:重建实战》:当你面对一坨代码时,你应该这么做
  2. BRICs---看看印度工程師為什麼那麼強
  3. 【2】ShutdownHTTP系列-HTTP报文篇
  4. 微信小程序: 数组删除操作splice()的坑
  5. springboot配置数据库连接池hikari
  6. NVIDIA GeForce GT 730 配置 CUDA
  7. android 无sdk usb/蓝牙 连接热敏打印机外卖小票打印
  8. 常州大学计算机专业老师,常州大学信息科学与工程学院导师介绍:马正华
  9. 牛妹的字符串(删除ascii码最小的k个字母)
  10. Image 常用命令整理