1. 需求概述
目标:
搭建支持单点登录(SSO)的认证中心,实现以下功能:
- 用户在其他网站点击登录时自动跳转至认证中心完成登录
- 前后端分离模式(前端展示页面,后端提供 API)
- 维护用户基本信息并提供外部 API 供其他系统查询
- 子系统通过接口动态获取用户信息
2. 系统架构设计
2.1 认证中心
功能模块:
- 提供登录页面,生成 Token 并跳转回子系统
- 维护用户基本信息(存储于数据库/Redis)
- 提供外部 API 接口(用户状态、详细信息查询)
- 支持
/sso/login
和/sso/callback
接口
技术特点:
- 前后端分离(前端页面 + RESTful API)
- Redis 存储用户信息(Key=Token,Value=JSON)
- 支持分布式部署,实现跨子系统会话共享
2.2 子系统
功能模块:
- 跳转至认证中心登录
- 接收 Token 并通过 API 获取用户信息
- 封装用户信息至
User
类
技术特点:
- 不依赖 Sa-Token,仅调用认证中心 API
- 用户信息统一封装管理
3. 关键技术点分析
3.1 单点登录(SSO)流程
- 子系统跳转认证中心
- 构造登录地址
redirect=http://subsystem.com/callback
- 浏览器重定向至认证中心登录页
- 用户登录认证中心
- 验证用户名/密码,生成 Token
- 附加 Token 至回调地址,重定向回子系统
- 子系统接收 Token
- 通过 API 查询用户信息
- 封装至
User
类
3.2 用户信息管理
角色与权限:
- 角色:用户身份抽象(如
admin
、user
) - 权限:操作/资源控制单元(如
user:add
、article:edit
) - 区分系统:通过命名空间(
systemA_admin
)或数据库字段隔离
Redis 存储:
- Key=Token,Value=用户信息 JSON
- 设置 Token 过期时间,登出时删除 Key
3.3 安全性
Token 管理:
- Redis 过期机制自动清理 Token
- 登出时立即删除 Token
- 可选:每次获取用户信息时刷新 Token 有效期
数据传输:
- 强制使用 HTTPS
- 敏感接口(如
/user/info
)进行权限校验
4. 实现流程总结
- 认证中心初始化
- 配置 Sa-Token + Redis
- 创建用户表存储基本信息
- 提供
/login
接口验证信息并生成 Token
- 单点登录跳转与回调
- 子系统构造登录地址带回调参数
- 认证中心生成 Token 后重定向回子系统
- 用户信息封装
- 子系统将 API 返回数据封装至
User
类(含 ID、用户名、角色/权限列表)
- 权限校验
- 按角色/权限控制页面/API 访问
- 各系统权限独立管理
5. 关键注意事项
5.1 角色与权限设计
- 粒度控制:细化权限(如
article:add
>article:*
) - 角色复用:将权限集合赋予角色(如
admin
含所有权限)
5.2 Redis 数据结构
- Key 设计:
systemA:token:<token>
(含系统标识) - Value 设计:JSON 格式存储用户信息 + 角色/权限列表
5.3 分布式支持
- 使用 Redis 集群/分布式缓存保障数据共享
- 限制 Redis 访问权限(仅认证中心 + 子系统)
5.4 性能优化
- 利用 Redis 过期机制清理无效 Token
- 对高频接口(如
/user/info
)做缓存优化
6. Token 续签机制
6.1 双 Token 设计原理
- access_token
- 短期有效(如30分钟)
- 用于常规API请求
- 泄露风险低(快速过期)
- refresh_token
- 长期有效(如7天)
- 仅用于获取新access_token
- 存储于HTTP-only Cookie增强安全性
6.2 续签流程
- 登录阶段
- 认证中心同时生成access_token和refresh_token
- refresh_token存入Redis并设置长过期时间
- 续签阶段
- 客户端用refresh_token调用专用接口
- 服务端验证后生成新双Token
- 旧refresh_token立即失效
- 安全控制
- 每次续签生成全新refresh_token
- 绑定设备指纹(IP/User-Agent)防盗用
6.3 失效场景处理
- refresh_token过期:强制重新登录
- 并发请求:通过Redis原子操作防重复使用
7. 总结
实现目标:
- 统一认证:集中管理所有子系统登录
- 灵活扩展:支持多系统角色/权限动态扩展
- 高效性能:Redis保障高并发响应
- 安全可靠:HTTPS + 双Token机制
- 体验优化:无感续签减少重复登录
::tongue::
OK
😌