首页 > 项目 > 当前页面

Spring Security OAuth2 单点登录(SSO)、认证与授权原理详解

2026-06-11 NEW个对象

🚀 Spring Security OAuth2 单点登录(SSO)、认证与授权原理详解

📌 核心结论:
OAuth2本质上是一套授权协议,Spring Security OAuth2则是OAuth2协议在Spring生态中的实现方案。通过认证中心(Authorization Server)统一管理用户身份,业务系统(Client)无需重复登录即可访问多个系统,实现单点登录(SSO)。整个过程围绕认证(Authentication)、授权(Authorization)、访问令牌(Access Token)、刷新令牌(Refresh Token)展开。

1️⃣ 问题背景

在传统单体系统时代,用户登录一次即可访问全部功能。

随着微服务和分布式架构的发展,一个企业往往拥有多个业务系统:

  • 用户中心
  • 订单中心
  • 支付中心
  • 商品中心
  • 运营后台
  • CRM系统
  • OA系统

如果每个系统都维护自己的登录逻辑,将产生大量问题。

  • 用户需要反复登录
  • 密码存储多份
  • 权限管理困难
  • 安全风险增加
  • 用户体验较差

因此企业通常会建立统一认证中心。

所有系统共用同一个登录入口。

用户只需登录一次即可访问多个系统。

⚠️ 这就是单点登录(Single Sign On,SSO)的核心思想。

2️⃣ 核心原理

认证(Authentication)

认证用于证明“你是谁”。

例如:

用户名 + 密码

验证身份

确认用户身份

认证成功后系统知道当前用户是谁。

授权(Authorization)

授权用于决定“你能做什么”。

例如:

  • 管理员可删除订单
  • 普通用户只能查看订单
  • 运营人员可管理商品

认证解决身份问题。

授权解决权限问题。

OAuth2角色模型

Resource Owner(用户)

Client(客户端)

Authorization Server(认证中心)

Resource Server(资源服务器)

OAuth2围绕这四种角色展开。

单点登录核心思想

用户登录认证中心一次。

认证中心签发Token。

多个系统共享Token。

从而实现一次登录,到处访问。

💡 SSO核心并不是Session共享,而是统一认证身份。

3️⃣ 数据结构分析

用户表

sys_user

id
username
password
status

角色表

sys_role

id
role_name

权限表

sys_permission

id
permission_code

用户角色关系表

sys_user_role

user_id
role_id

角色权限关系表

sys_role_permission

role_id
permission_id

Spring Security最终会将这些信息封装成:

Authentication

Principal

Authorities

其中Authorities保存当前用户拥有的角色和权限。

4️⃣ 算法分析

JWT生成算法

现代OAuth2通常使用JWT作为Token。

JWT由三部分组成:

Header

Payload

Signature

Payload中通常包含:

  • 用户ID
  • 用户名
  • 角色信息
  • 权限信息
  • 过期时间

权限匹配算法

Spring Security底层采用责任链模式。

请求到达

FilterChain

AuthenticationFilter

AuthorizationFilter

资源访问

每个过滤器负责不同安全校验。

RBAC授权模型

User

Role

Permission

Spring Security默认最适合RBAC模型实现。

5️⃣ 执行流程

OAuth2登录流程

用户访问订单系统

发现未登录

重定向认证中心

输入用户名密码

认证中心验证身份(如果微服务,则在网关(gateway)过滤器调用认证中心接口,进行验证。如果是单体服务则需要提供校验方法在过滤器,进行校验)

认证成功

生成Authorization Code

回调订单系统

订单系统换取Access Token

获取用户信息

登录成功

单点登录流程

访问系统A

跳转认证中心

完成登录

认证中心Session生效

访问系统B

再次跳转认证中心

发现已登录

直接返回Token

登录成功

整个过程用户只输入一次密码。

这就是SSO。

资源访问流程

客户端请求资源

携带AccessToken

ResourceServer验证Token

解析JWT

获取权限信息

权限校验

允许访问

6️⃣ 实际案例

场景一:统一登录中心

企业存在以下系统:

  • user-system
  • order-system
  • payment-system
  • crm-system

所有系统接入OAuth2认证中心。

浏览器

认证中心(Auth Server)

JWT Token

订单系统
支付系统
CRM系统

用户登录一次即可访问全部系统。

场景二:接口权限控制

GET /order/list
ROLE_USER
DELETE /order/delete
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 统一认证授权 架构复杂
✅ 当前互联网企业最主流方案:Spring Security + OAuth2 + JWT + Gateway

8️⃣ 面试常见问题

OAuth2和Spring Security是什么关系?

OAuth2是协议规范。

Spring Security OAuth2是协议实现。

认证和授权区别是什么?

认证解决是谁的问题。

授权解决能干什么的问题。

OAuth2有哪些角色?

用户、客户端、认证服务器、资源服务器。

JWT为什么适合微服务?

无状态。

无需共享Session。

天然适合分布式部署。

单点登录为什么能做到一次登录?

认证中心维护统一登录状态。

各业务系统共享认证结果。

Access Token和Refresh Token区别?

Access Token用于访问资源。

Refresh Token用于刷新Token。

Spring Security权限校验在哪里执行?

FilterChain过滤器链中执行。

生产环境如何设计OAuth2架构?

Nginx

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负责跨服务传递身份信息,最终实现统一认证、统一授权和单点登录。
OAuth2授权码模式?(面试有问到,之前只了解获取token,不了解授权模式)

认证中心提供获取授权码的接口,客户端拿到授权码之后,根据授权码获取token。

OAuth2三方登录授权码模式深度解析

相关文章

NEW个对象 NEW个对象
JAVA是世界上最好的语言