目录
一、单点登录(SSO)到底是什么?
1. 核心定义
2. 核心解决的问题
3. 主流 SSO 实现方案(生产环境选型)
二、核心原理(必须懂,不然代码看不懂)
1. 整体流程
2. 关键组件
三、Java 生产环境实战(完整可运行)
架构说明
第一步:搭建通用依赖(所有项目共用)
1. pom.xml 核心依赖
2. 通用配置(application.yml)
第二步:编写通用工具类(JWT + Redis)
1. JWT 工具类(生成、解析令牌)
2. Redis 工具类
第三步:搭建 SSO 认证中心(sso-server)
1. 用户实体类
2. 登录接口(核心)
第四步:搭建子系统(sso-client)
1. 编写登录拦截器
2. 子系统调用 SSO 接口工具类
3. 注册拦截器
4. 子系统测试接口
四、生产环境完整测试流程
五、生产环境关键优化(必看)
总结
一、单点登录(SSO)到底是什么?
1. 核心定义
单点登录(Single Sign-On,SSO):一次登录,多系统通行。用户在一个认证中心登录后,访问同域名 / 跨域名的其他所有子系统、第三方系统时,无需重复输入账号密码,自动完成登录认证。
2. 核心解决的问题
- 多系统(如电商后台、支付系统、用户中心)重复登录,体验差
- 多套账号密码,管理混乱、安全风险高
- 生产环境统一权限管控、统一登出
3. 主流 SSO 实现方案(生产环境选型)
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| JWT + Redis | 微服务、前后端分离、中小型项目 | 轻量、无侵入、易部署 | 不适合超大型分布式 |
| OAuth2.0 | 第三方登录(微信 / QQ 登录) | 标准协议、安全 | 配置复杂 |
| CAS | 传统企业级单体 / 集群项目 | 成熟稳定 | 重、学习成本高 |
| SAML2.0 | 政企、金融系统 | 极高安全 | 极复杂 |
✅ 生产实战选型:SpringBoot + JWT + Redis(最通用、轻量、企业级落地首选)
二、核心原理(必须懂,不然代码看不懂)
1. 整体流程
- 用户访问子系统 A→ 未登录 → 重定向到SSO 认证中心
- 认证中心校验账号密码→ 校验通过
- 生成 JWT 令牌→ 存入 Redis(存储用户信息、设置过期时间)
- 返回令牌给前端(Cookie/Header)
- 用户访问子系统 B → 携带令牌 → 子系统请求认证中心校验
- 校验通过 → 自动登录,无需输入密码
2. 关键组件
- SSO 认证中心:统一登录、登出、令牌校验(独立服务)
- JWT:轻量令牌,存储用户标识
- Redis:存储令牌,支持统一登出、令牌过期管理
- 拦截器:所有子系统统一校验令牌
三、Java 生产环境实战(完整可运行)
架构说明
- sso-server:单点登录认证中心(核心)
- sso-client1、sso-client2:两个子系统(模拟多系统)
- 技术栈:SpringBoot 2.7+、JWT、Redis、Mysql、MyBatis-Plus
第一步:搭建通用依赖(所有项目共用)
1. pom.xml 核心依赖
<!-- SpringBoot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- JWT --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.9.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.9.1</version> <scope>runtime</scope> </dependency>