单点登录的实现方案
单点登录(SSO,Single Sign-On)是一种认证机制,允许用户在一次登录后,访问多个系统或应用而无需重复登录。下面是常见的单点登录实现方案,包括思路、技术选型和适用场景:
🔧 一、单点登录的核心思路
- 用户登录统一认证中心(SSO Server)
- 认证中心验证身份后签发令牌(Token/Cookie/Session)
- 客户端或子系统通过该令牌进行身份校验
- 在不同系统间共享登录状态(通过 Token 传递、Cookie 共享、后端会话等)
🧩 二、常见的实现方案
1. 基于 Cookie 的单点登录(适用于同域名或子域)
✅ 特点
- 简单易实现
- 需要系统部署在同一个主域下(如
a.example.com
和b.example.com
)
🛠 实现方式
- 设置主域名的 Cookie(例如
.example.com
) - 子系统共享此 Cookie,自动携带认证信息
🔒 安全点
- HTTPS 加密
- 设置
HttpOnly
和Secure
属性 - 防 CSRF 攻击
2. 基于 Token(JWT)+ 前后端分离
✅ 特点
- 前后端解耦,适用于微服务架构
- Token(通常是 JWT)保存在客户端(localStorage、sessionStorage、Cookie)
🛠 实现方式
- 用户登录后,SSO 服务签发 JWT
- 前端保存 Token,访问其他系统时附加 Token 头部(Authorization: Bearer xxx)
- 资源服务器验证 JWT 签名及有效期
🔒 安全点
- Token 加密/签名
- Token 过期与刷新机制(Refresh Token)
- 防止 Token 泄露
3. 使用 OAuth 2.0 / OpenID Connect 实现单点登录
✅ 特点
- 标准协议,兼容性强
- 支持第三方接入(如 GitHub 登录、Google 登录)
- 可用于异构系统之间的认证
🛠 实现方式
- 用户在 SSO Provider(如 Auth0、Keycloak)登录
- 授权码模式(Authorization Code)为主流程
- 系统作为 OAuth Client,与认证服务器通信获取 Token
📘 推荐开源组件:
- Keycloak
- Auth0(商业)
- FusionAuth
- Spring Security OAuth2(适用于 Java/Spring 系统)
4. CAS(Central Authentication Service)
✅ 特点
- 经典 Java 实现的单点登录协议
- 学校、企业内部系统常用
🛠 实现方式
- 用户登录 CAS Server,获得 Ticket
- 子系统拿 Ticket 请求 CAS Server 验证
- 验证成功后建立本地会话
🏗 三、系统架构图(简化版)
+-------------------+
| SSO 认证中心 |
+-------------------+
|
+--------+--------+
| |
+---------------+ +---------------+
| 子系统 A | | 子系统 B |
+---------------+ +---------------+
↑ ↓ ↑ ↓
用户访问(携带 Token 或 Cookie)
📌 四、选型建议
场景 | 推荐方案 |
---|---|
同域名系统 | Cookie 共享 |
跨域、前后端分离系统 | JWT / OAuth2 |
微服务架构、身份集中管理 | OAuth2 / OpenID Connect / Keycloak |
企业/高校内部系统 | CAS |