使用 Sa-Token 搭建用户认证中心

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)流程

  1. 子系统跳转认证中心
  • 构造登录地址 redirect=http://subsystem.com/callback
  • 浏览器重定向至认证中心登录页
  1. 用户登录认证中心
  • 验证用户名/密码,生成 Token
  • 附加 Token 至回调地址,重定向回子系统
  1. 子系统接收 Token
  • 通过 API 查询用户信息
  • 封装至 User

3.2 用户信息管理

角色与权限:

  • 角色:用户身份抽象(如 adminuser
  • 权限:操作/资源控制单元(如 user:addarticle:edit
  • 区分系统:通过命名空间(systemA_admin)或数据库字段隔离

Redis 存储:

  • Key=Token,Value=用户信息 JSON
  • 设置 Token 过期时间,登出时删除 Key

3.3 安全性

Token 管理:

  • Redis 过期机制自动清理 Token
  • 登出时立即删除 Token
  • 可选:每次获取用户信息时刷新 Token 有效期

数据传输:

  • 强制使用 HTTPS
  • 敏感接口(如 /user/info)进行权限校验

4. 实现流程总结

  1. 认证中心初始化
  • 配置 Sa-Token + Redis
  • 创建用户表存储基本信息
  • 提供 /login 接口验证信息并生成 Token
  1. 单点登录跳转与回调
  • 子系统构造登录地址带回调参数
  • 认证中心生成 Token 后重定向回子系统
  1. 用户信息封装
  • 子系统将 API 返回数据封装至 User 类(含 ID、用户名、角色/权限列表)
  1. 权限校验
  • 按角色/权限控制页面/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 续签流程

  1. 登录阶段
  • 认证中心同时生成access_token和refresh_token
  • refresh_token存入Redis并设置长过期时间
  1. 续签阶段
  • 客户端用refresh_token调用专用接口
  • 服务端验证后生成新双Token
  • 旧refresh_token立即失效
  1. 安全控制
  • 每次续签生成全新refresh_token
  • 绑定设备指纹(IP/User-Agent)防盗用

6.3 失效场景处理

  • refresh_token过期:强制重新登录
  • 并发请求:通过Redis原子操作防重复使用

7. 总结

实现目标:

  • 统一认证:集中管理所有子系统登录
  • 灵活扩展:支持多系统角色/权限动态扩展
  • 高效性能:Redis保障高并发响应
  • 安全可靠:HTTPS + 双Token机制
  • 体验优化:无感续签减少重复登录

评论

  1. 博主
    2 月前
    2025-4-16 19:25:29

    ::tongue::

    • 博主
      yuanshanen
      2 月前
      2025-4-17 11:31:01

      OK

  2. 博主
    2 月前
    2025-4-25 17:35:37

    😌

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!