JWT实现单点登录问题
dianpule 2025-05-15 17:30 7 浏览
JSON Web 令牌(JWT)是一种开放标准(RFC 7519) ,它定义了一种紧凑和自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。可以验证和信任此信息,因为它是数字签名的。JWTs 可以使用 secret (使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。
通俗的解释:JWT简称 JSON Web Token,也就是JSON形式作为Web应用中的令牌信息,用于在各方之间安全的将信息作为JSON对象传输,在数据传输过程中可以完成数据加密,签名等操作。
session认证
我们最先接触到的认证方式就是基于Session的认证方式,每一个会话在服务端都会存储在HttpSession中,相当于一个Map,然后通过Cookie的形式给客户端返回一个jsessionid,然后每次访问的时候都需要从HttpSession中根据jsessionid来获取,通过这个逻辑来判断是否是认证的状态。
Session认证虽然是常见且有效的身份验证和会话管理机制,但也存在一些潜在的弊端问题:
- 服务器端存储开销:每个活跃会话都需要在服务器端存储会话数据,这可能会占用服务器资源,特别是在用户量较大或会话数据较大的情况下会造成OOM。
- 扩展性问题:随着用户量的增加,服务器端会话存储的管理和扩展可能变得复杂。需要考虑如何处理负载均衡、高可用性和容错等问题。
- 会话劫持风险:如果会话标识符未经充分保护,攻击者可能会通过各种手段(如会话劫持、会话固定攻击)获取合法用户的会话,从而冒充用户。
- 跨站点请求伪造(CSRF)攻击:虽然Session认证本身不直接防止CSRF攻击,但可以结合其他技术(如CSRF Token)来增强安全性。如果未正确实施,会增加应用程序的安全风险。
- 会话管理复杂性:管理会话的过期、续期和注销过程可能会变得复杂,尤其是在多个设备和会话的情况下。
- 移动设备和API的兼容性:对于移动设备和API,通常需要额外的考虑,以确保会话管理的安全性和效率。
- 单点故障:如果会话存储在单个服务器或单个数据中心,并且该服务器或数据中心发生故障,则可能导致所有用户的会话失效或不可用。
基于JWT的认证
认证的流程:
- 用户通过表单把账号密码提交到后端服务后,如果认证成功就会生成一个对应的Token信息
- 之后用户请求资源都会携带这个Token值,后端获取到后校验通过放行,校验不通过拒绝
jwt的优势:
- 简介:可以通过URL,POST参数或者HTTP header发送,因为数据量小,传输速度快。
- 自包含:负载中包含了所有用户所需的信息,避免多次查询数据
- 夸语音:以JSON形式保存在客户端。
- 不需要服务端保存信息,适合分布式环境。
jwt组成
jwt令牌的组成:
- 标头(Header)
- 有效载荷(Payload)
- 签名(Signature)
因此JWT的格式为: xxxx.yyyy.zzzz Header.Payload.Signature
Header:
header通常由两部分组成:令牌的类型【JWT】和所使用的签名算法。例如HMAC、SHA256或者RSA,它会使用 Base64 编码组成 JWT结构的第一部分。注意:Base64是一种编码,是可以被翻译回原来的样子的。
{
"alg":"HS256",
"typ":"JWT"
}
Payload:
令牌的第二部分是有效负载,其中包含声明,声明是有关实体(通常是用户信息)和其他数据的声明,它会使用Base64来编码,组成JWT结构的第二部分。
{
"userId":"123444",
"userName":"yulang",
"admin":true
}
注意:载体中的数据只是进行了base64编码,所以在使用的时候需要注意下不用存放敏感的数据。
Signature:
签名部分,前面两部分都是使用 Base64 进行编码的,即前端可以解开header和payload中的信息,Signature需要使用编码后的 header 和 payload 以及我们提供的一个秘钥,然后使用 header 中指定的前面算法(HS256) 进行签名,签名的作用是保证 JWT 没有被篡改过
代码实现:
/**
* 生成Token信息
*/
public static String createToken(String userId) {
// 使用 HMAC SHA-256 算法生成密钥
Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
String jws = Jwts.builder()
.setSubject("yulang-token")
.claim("userId", userId)
.setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1小时后过期
.signWith(key)
.compact();
return jws;
}
根据Token来验证是否正确。
public static String parseToken(String token) {
// 使用 HMAC SHA-256 算法生成密钥
Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
Claims claims = Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(token)
.getBody();
System.out.println("Subject: " + claims.getSubject());
System.out.println("Expiration: " + claims.getExpiration());
return claims.get("userId")+ "";
}
要让拦截器生效我们还需要添加对应的配置类。
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JWTInterceptor())
.addPathPatterns("/queryUser") // 需要拦截的请求
.addPathPatterns("/saveUser") // 需要拦截的请求
.excludePathPatterns("/login"); // 需要排除的请求
}
}
登录使用:
@PostMapping
public String login(@RequestBody @Validated LoginDTO loginDTO) {
// 业务操作 校验用户 密码
User user = new User();
user.setUserName(loginDTO.getUsername());
user.setUserId("11000");
String token = TokenUtil.createToken(user.getUserId());
stringRedisTemplate.opsForValue().set(user.getUserId(), JSONUtil.toJsonStr(user));
return token;
}
验证
验证获取登录后的数据:
@GetMapping("/index")
public User index() {
// 业务操作 校验用户 密码
return UserInfoHolderUtil.get();
}
相关推荐
- 三天学会使用MyBatis,绝对干货,只实战,不学究
-
2022最新版Mybatis框架教程来咯!开肝!快速开启你的MyBatis之旅!通过本课程的学习,可以在最短的时间内学会使用持久层框架MyBatis,在该视频中没有废话,都是干货,该视频的讲解不是学术...
- Mybatis系列-4-Mapper动态代理(mybatis接口动态代理原理)
-
冰冻三尺,非一日之寒。Mybatis相关源码及文档:Mybatis官方技术文档https://mybatis.org/mybatis-3/zh/index.htmlMybatis源码包下...
- MyBatisPlus又在搞事了!一个依赖轻松搞定权限问题!堪称神器
-
前言:今天介绍一个MyBatis-Plus官方发布的神器:mybatis-mate为mp企业级模块,支持分库分表,数据审计、数据敏感词过滤(AC算法),字段加密,字典回写(数据绑定),数...
- 面试官:如何通过 MyBatis 查询千万数据并保证内存不溢出?
-
推荐学习真香警告!Alibaba珍藏版mybatis手写文档,刷起来牛掰!“基础-中级-高级”Java程序员面试集结,看完献出我的膝盖闭关28天,奉上[Java一线大厂高岗面试题解析合集],备战金九银...
- Mybatis配置文件XML全貌详解,再不懂我也没招了
-
一、为什么要使用配置文件试想,如果没有配置文件,我们的应用程序将只能沿着固定的姿态运行,几乎不能做任何动态的调整,那么这不是一套完美的设计,因为我们希望拥有更宽更灵活的操作空间和更多的兼容度,同时也能...
- MyBatis3源码解析-执行SQL流程(mybatis源码多少行)
-
获取SQL思考:Mybatis是如何获取SQL的?即是如何获取到我们写的mapper文件的?其实我们有在XML配置文件中配置标签来加载我们的mapper文件。Mybatis加载mapper文件有几种方...
- MyBatis与Hibernate的对比分析:探索持久化框架的最佳选择
-
MyBatis与Hibernate的对比分析:探索持久化框架的最佳选择在Java后端开发中,持久化框架是不可或缺的一部分,而MyBatis和Hibernate无疑是其中最耀眼的明星。这两个框架各自拥有...
- Mybatis-日志配置(mybatisplus日志级别配置)
-
日志Mybatis的内置日志工厂提供日志功能,内置日志工厂将日志交给以下其中一种工具作代理:SLF4JApacheCommonsLoggingLog4j2Log4jJDKloggingMyB...
- mybatis手把手教学,希望大家能拿下它
-
目录1.jdbc封装中的问题12.mybatis介绍43.框架搭建41)导包52)配置文件6配置dtd约束73)创建SqlSessionFactory对象94.入门案例91.部门实体...
- MyBatis的SQL执行流程不清楚?看完这一篇就够了
-
推荐学习真香警告!Alibaba珍藏版mybatis手写文档,刷起来全网独家的“MySQL高级知识”集合,骨灰级收藏,手慢则无前言MyBatis可能很多人都一直在用,但是MyBatis的SQL执行...
- MyBatis系列-2-日志配置(mybatisplus日志级别配置)
-
日积月累,方成大器。各大网站:Mybatis官方技术文档https://mybatis.org/mybatis-3/zh/index.htmlMybatis源码包下载:https://github...
- 「MyBatis」官方文档阅读笔记(三)
-
MyBatis映射文件前言demo的项目地址:https://gitee.com/shuashua-world/shuashua-blog/tree/master/demo/mybatis-simpl...
- Mybatis介绍与入门(mybatis入门教程)
-
1.官方文档Mybatis中文手册:mybatis–MyBatis3或者MyBatis中文网Maven仓库:MavenRepository:org.mybatis˃˃mybatis...
- 阿里资深架构师整理分享内部绝密MyBatis源码深度解析文档
-
前言MyBatis作为持久层框架,以其小巧轻便、SQL可配置、使用简单等特点深受广大Java开发者喜爱。然而大多数开发人员对MyBatis框架的理解仅局限于使用,并不理解框架底层的实现原理。作为一名开...
- MyBatis要不要学?字节跳动的内部的这份文档真香
-
前言很多人说mybatis重不重要?这里再说下,互联网公司基本都是用mybatis做为持久层框架的,所以mybatis是一定要学的。程序员80%时间都在CRUD,对了mybatis就是干这个的什么是...
- 一周热门
- 最近发表
-
- 三天学会使用MyBatis,绝对干货,只实战,不学究
- Mybatis系列-4-Mapper动态代理(mybatis接口动态代理原理)
- MyBatisPlus又在搞事了!一个依赖轻松搞定权限问题!堪称神器
- 面试官:如何通过 MyBatis 查询千万数据并保证内存不溢出?
- Mybatis配置文件XML全貌详解,再不懂我也没招了
- MyBatis3源码解析-执行SQL流程(mybatis源码多少行)
- MyBatis与Hibernate的对比分析:探索持久化框架的最佳选择
- Mybatis-日志配置(mybatisplus日志级别配置)
- mybatis手把手教学,希望大家能拿下它
- MyBatis的SQL执行流程不清楚?看完这一篇就够了
- 标签列表
-
- effective java (49)
- es6 js (60)
- hi3861 (44)
- opendaylight (63)
- etcdctl (33)
- es6 set (51)
- js reflect (34)
- easywechat (32)
- promise.reject (32)
- cube-ui (30)
- es6 proxy (33)
- es6 import (31)
- js yield (33)
- bookstack (31)
- iframe 属性 (31)
- 数据库设计说明书 (30)
- redission (33)
- mouseevent (31)
- canvas api (30)
- shell grep (32)
- idea 快捷键在哪里设置 (33)
- markdown引用 (33)
- canvas动画 (32)
- material design (31)
- seata分布式事务 (31)