Spring Security OAuth2 单点登录(SSO)、认证与授权原理详解
🚀 Spring Security OAuth2 单点登录(SSO)、认证与授权原理详解
OAuth2本质上是一套授权协议,Spring Security OAuth2则是OAuth2协议在Spring生态中的实现方案。通过认证中心(Authorization Server)统一管理用户身份,业务系统(Client)无需重复登录即可访问多个系统,实现单点登录(SSO)。整个过程围绕认证(Authentication)、授权(Authorization)、访问令牌(Access Token)、刷新令牌(Refresh Token)展开。
1️⃣ 问题背景
在传统单体系统时代,用户登录一次即可访问全部功能。
随着微服务和分布式架构的发展,一个企业往往拥有多个业务系统:
- 用户中心
- 订单中心
- 支付中心
- 商品中心
- 运营后台
- CRM系统
- OA系统
如果每个系统都维护自己的登录逻辑,将产生大量问题。
- 用户需要反复登录
- 密码存储多份
- 权限管理困难
- 安全风险增加
- 用户体验较差
因此企业通常会建立统一认证中心。
所有系统共用同一个登录入口。
用户只需登录一次即可访问多个系统。
2️⃣ 核心原理
认证(Authentication)
认证用于证明“你是谁”。
例如:
↓
验证身份
↓
确认用户身份
认证成功后系统知道当前用户是谁。
授权(Authorization)
授权用于决定“你能做什么”。
例如:
- 管理员可删除订单
- 普通用户只能查看订单
- 运营人员可管理商品
认证解决身份问题。
授权解决权限问题。
OAuth2角色模型
↓
Client(客户端)
↓
Authorization Server(认证中心)
↓
Resource Server(资源服务器)
OAuth2围绕这四种角色展开。
单点登录核心思想
用户登录认证中心一次。
认证中心签发Token。
多个系统共享Token。
从而实现一次登录,到处访问。
3️⃣ 数据结构分析
用户表
id
username
password
status
角色表
id
role_name
权限表
id
permission_code
用户角色关系表
user_id
role_id
角色权限关系表
role_id
permission_id
Spring Security最终会将这些信息封装成:
↓
Principal
↓
Authorities
其中Authorities保存当前用户拥有的角色和权限。
4️⃣ 算法分析
JWT生成算法
现代OAuth2通常使用JWT作为Token。
JWT由三部分组成:
↓
Payload
↓
Signature
Payload中通常包含:
- 用户ID
- 用户名
- 角色信息
- 权限信息
- 过期时间
权限匹配算法
Spring Security底层采用责任链模式。
↓
FilterChain
↓
AuthenticationFilter
↓
AuthorizationFilter
↓
资源访问
每个过滤器负责不同安全校验。
RBAC授权模型
↓
Role
↓
Permission
Spring Security默认最适合RBAC模型实现。
5️⃣ 执行流程
OAuth2登录流程
↓
发现未登录
↓
重定向认证中心
↓
输入用户名密码
↓
认证中心验证身份(如果微服务,则在网关(gateway)过滤器调用认证中心接口,进行验证。如果是单体服务则需要提供校验方法在过滤器,进行校验)
↓
认证成功
↓
生成Authorization Code
↓
回调订单系统
↓
订单系统换取Access Token
↓
获取用户信息
↓
登录成功
单点登录流程
↓
跳转认证中心
↓
完成登录
↓
认证中心Session生效
↓
访问系统B
↓
再次跳转认证中心
↓
发现已登录
↓
直接返回Token
↓
登录成功
整个过程用户只输入一次密码。
这就是SSO。
资源访问流程
↓
携带AccessToken
↓
ResourceServer验证Token
↓
解析JWT
↓
获取权限信息
↓
权限校验
↓
允许访问
6️⃣ 实际案例
场景一:统一登录中心
企业存在以下系统:
- user-system
- order-system
- payment-system
- crm-system
所有系统接入OAuth2认证中心。
↓
认证中心(Auth Server)
↓
JWT Token
↓
订单系统
支付系统
CRM系统
用户登录一次即可访问全部系统。
场景二:接口权限控制
ROLE_USER
ROLE_ADMIN
Spring Security根据JWT中的角色信息进行权限校验。
场景三:Token刷新
Access Token一般有效期较短。
例如:
- Access Token:2小时
- Refresh Token:30天
Access Token过期后。
客户端使用Refresh Token换取新的Access Token。
无需再次登录。
7️⃣ 优缺点分析
| 方案 | 优点 | 缺点 |
|---|---|---|
| Session共享 | 实现简单 | 扩展性差 |
| JWT方案 | 无状态、高性能 | Token撤销复杂 |
| OAuth2 SSO | 统一认证授权 | 架构复杂 |
8️⃣ 面试常见问题
OAuth2和Spring Security是什么关系?
OAuth2是协议规范。
Spring Security OAuth2是协议实现。
认证和授权区别是什么?
认证解决是谁的问题。
授权解决能干什么的问题。
OAuth2有哪些角色?
用户、客户端、认证服务器、资源服务器。
JWT为什么适合微服务?
无状态。
无需共享Session。
天然适合分布式部署。
单点登录为什么能做到一次登录?
认证中心维护统一登录状态。
各业务系统共享认证结果。
Access Token和Refresh Token区别?
Access Token用于访问资源。
Refresh Token用于刷新Token。
Spring Security权限校验在哪里执行?
FilterChain过滤器链中执行。
生产环境如何设计OAuth2架构?
↓
Gateway
↓
OAuth2认证中心
↓
JWT签发
↓
微服务集群
这是当前互联网企业最常见架构。
9️⃣ 总结
✅ OAuth2本质是授权协议。
✅ Spring Security是认证授权框架。
✅ OAuth2负责身份授权流程。
✅ Spring Security负责安全控制。
✅ JWT负责用户身份传递。
✅ SSO负责统一登录体验。
✅ Resource Server负责资源访问控制。
✅ Authorization Server负责身份认证和Token签发。
✅ RBAC负责权限管理。
Spring Security OAuth2单点登录的核心思想是建立统一认证中心,用户只需登录一次即可获取Access Token,后续访问各个业务系统时携带Token完成身份认证和权限校验。认证解决“你是谁”,授权解决“你能做什么”,JWT负责跨服务传递身份信息,最终实现统一认证、统一授权和单点登录。
相关文章