news 2026/7/12 18:56:41

Spring Security OAuth2.0(19):JWT令牌/生成令牌/校验令牌

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Security OAuth2.0(19):JWT令牌/生成令牌/校验令牌

文章目录

    • 1. JWT令牌介绍
      • 1.1 什么是JWT?
      • 1.2 JWT的结构
      • 1.3 JWT的应用场景
    • 2 如何配置JWT令牌
      • 2.1 修改UAA工程配置JWT令牌服务
      • 2.2 修改业务模块的代码本地检查令牌

1. JWT令牌介绍

1.1 什么是JWT?

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为JSON对象。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),通过点号(.)分隔。

JWT的主要特点:

  • 紧凑性:体积小,可通过URL、POST参数或HTTP头部传输
  • 自包含性:包含所有必要信息,减少数据库查询
  • 安全性:使用签名确保令牌不被篡改
  • 标准化:基于JSON格式,跨语言支持良好

1.2 JWT的结构

一个典型的JWT令牌格式:xxxxx.yyyyy.zzzzz

1. 头部(Header)

{"alg":"HS256","typ":"JWT"}
  • alg:签名算法(如HS256、RS256)
  • typ:令牌类型,固定为"JWT"

2. 载荷(Payload)
包含声明(claims),分为三类:

  • 注册声明:预定义的声明,如iss(签发者)、exp(过期时间)、sub(主题)
  • 公共声明:可自定义,但应避免冲突
  • 私有声明:自定义声明,用于传递业务数据

3. 签名(Signature)
使用头部指定的算法,对编码后的头部和载荷进行签名,确保令牌完整性。

1.3 JWT的应用场景

  1. 身份认证:用户登录后,服务器生成JWT返回给客户端
  2. 授权:访问受保护资源时,客户端携带JWT
  3. 信息交换:安全地在各方之间传递信息

2 如何配置JWT令牌

2.1 修改UAA工程配置JWT令牌服务

(1)配置JWT令牌存储和密钥(这里配置加密和解密相同密码)

publicclassTokenConfig{privateStringSIGNING_KEY="123456";// @Bean// public TokenStore tokenStore(){// /**// * 使用内存存储令牌(普通令牌)// */// return new InMemoryTokenStore();// }/** * 配置JWT令牌存储 * @return */@BeanpublicTokenStoretokenStore(){returnnewJwtTokenStore(accessTokenConverter());}@BeanpublicJwtAccessTokenConverteraccessTokenConverter(){JwtAccessTokenConverterconverter=newJwtAccessTokenConverter();converter.setSigningKey(SIGNING_KEY);returnconverter;}}

(2) 配置AuthorizationServer 令牌增强

...............@AutowiredprivateClientDetailsServiceclientDetailsService;................//令牌增强TokenEnhancerChaintokenEnhancerChain=newTokenEnhancerChain();tokenEnhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter));service.setTokenEnhancer(tokenEnhancerChain);

(3)获取令牌(测试)。启动UAA后,获取令牌,可以看到令牌的长度比较厂,格式如何JWT令牌格式。

(4) 校验令牌(测试)。拿到前面的令牌,使用/uaa/oauth/check_token 接口查看令牌内容。

2.2 修改业务模块的代码本地检查令牌

(1)在order工程中,配置config下创建TokenConfig,代码与UAA下面的TokenConfig一致

packagecom.it2.security.distributed.order.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.oauth2.provider.token.TokenStore;importorg.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;importorg.springframework.security.oauth2.provider.token.store.JwtTokenStore;@ConfigurationpublicclassTokenConfig{privateStringSIGNING_KEY="123456";// @Bean// public TokenStore tokenStore(){// /**// * 使用内存存储令牌(普通令牌)// */// return new InMemoryTokenStore();// }/** * 配置JWT令牌存储 * @return */@BeanpublicTokenStoretokenStore(){returnnewJwtTokenStore(accessTokenConverter());}@BeanpublicJwtAccessTokenConverteraccessTokenConverter(){JwtAccessTokenConverterconverter=newJwtAccessTokenConverter();converter.setSigningKey(SIGNING_KEY);returnconverter;}}

(2) 将TokenStore 注入到资源服务中使用,并注释之前的远程令牌验证

@AutowiredprivateTokenStoretokenStore;@Overridepublicvoidconfigure(ResourceServerSecurityConfigurerresources)throwsException{resources.resourceId(RESOURCE_ID)//资源id.tokenStore(tokenStore)//自己验证令牌// .tokenServices(tokenService()) //验证令牌的服务.stateless(true);}

(3)启动order服务,并关闭UAA,使用刚刚获取的JWT令牌访问r1资源.,可以正常访问,说明了业务服务没有使用远程认证的方式校验令牌,而是自己本地校验令牌。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/12 18:53:52

归并排序Java代码,分而治之!这算法,不学后悔一辈子

归并排序算法详细解析之中, 归并排序属于一种经典的分治法算法, 它在数据结构课程里占据着重要的地位, 尤其是在那本由严蔚敏和吴伟民编著、清华大学出版社出版的《数据结构(C语言版)》一书中。该算法的核心函数Merge(), 目的在于合并两个已经排序好的子序列, 从而形成一个全新…

作者头像 李华
网站建设 2026/7/12 18:53:19

高并发场景测试方案设计

普通接口压测无法模拟秒杀、抢购、大促等高并发场景,高并发测试需要专属方案设计、场景建模、数据准备、压测策略、校验规则。本文手把手教你落地企业高并发场景测试方案,适配秒杀、限时活动、峰值流量场景。一、高并发场景核心特点瞬时大流量、集中请求…

作者头像 李华
网站建设 2026/7/12 18:53:02

深度解析PPet:现代Electron桌面应用中的Live2D角色实现架构

深度解析PPet:现代Electron桌面应用中的Live2D角色实现架构 【免费下载链接】PPet 👻在你的桌面放一个萌妹子,多一点乐趣😏~(支持Mac、Win和Linux) 项目地址: https://gitcode.com/gh_mirrors/pp/PPet …

作者头像 李华
网站建设 2026/7/12 18:52:09

Python的zip()就像万能拉链!一行代码让数据完美配对,你还在手动拼接?

zip()属于中相当好用的内置类型当中的一个, 它具有可接纳多个能够迭代对象参数的特点, 进而返回一个迭代器, 这个迭代器能够将不同可迭代对象的元素予以组合。不过呢, 存在着不少同学并不晓得 zip(), 或者没办法熟练地掌控它的用法, 所以此文打算去做一个更加详尽的梳理。内容主…

作者头像 李华
网站建设 2026/7/12 18:51:03

MetaTube SDK Go社区贡献指南:如何参与开源项目开发与维护

MetaTube SDK Go社区贡献指南:如何参与开源项目开发与维护 【免费下载链接】metatube-sdk-go MetaTube SDK & API Server in Golang 项目地址: https://gitcode.com/gh_mirrors/me/metatube-sdk-go MetaTube SDK Go是一个用Golang编写的元数据管理SDK和A…

作者头像 李华
网站建设 2026/7/12 18:50:41

Day20 Spring Boot Actuator监控体系:生产可观测性标配

专栏:《Java后端工程师进阶之路》从CRUD到AI工程师的完整跃迁路径(Day 20/ 90):从"服务挂了才发现"到"服务还没挂就知道",差的不是运气,是一套像样的监控。 场景再现:"…

作者头像 李华