当前位置: 首页 > article >正文

前端实现单点登录(SSO)的方案

概念:单点登录(Single Sign-On, SSO)主要是在多个系统、多个浏览器或多个标签页之间共享登录状态,保证用户只需登录一次,就能访问多个关联应用,而不需要重复登录。

💡 方案分类

1. 前端级别 SSO(仅适用于同源)

适用于:同一域名下的多个系统或标签页

方案适用范围共享方式缺点
localStorage同浏览器、同源localStorage 共享 token不支持跨浏览器或隐身模式
sessionStorage仅当前标签页sessionStorage关闭标签页即失效
cookie同域、所有浏览器服务器 Set-Cookie不能跨域,容量限制
BroadcastChannel同浏览器、同域postMessage 事件广播仅适用于同浏览器

2. 前后端结合 SSO(适用于跨域)

适用于:多个子系统,支持不同域名共享登录

方案适用范围共享方式适合场景
OAuth 2.0 + JWT跨域、多端通过授权服务器获取 token第三方登录(微信、GitHub)
CAS (Central Authentication Service)内部系统CAS 服务器管理登录态企业内网统一认证
SSO + Cookie(SameSite=None + CORS)跨子域主域 *.example.com 共享 cookie适用于 SaaS 平台
SSO + Redis + Session跨域token 存 Redis,前端查询高并发业务

🔹 方案 1:前端 localStorage + BroadcastChannel(适用于同域)

适用于:同一浏览器的多个标签页
💡 实现思路

  1. 登录时,将 token 存入 localStorage 并通知其他标签页

  2. 新标签页打开时,自动获取 localStoragetoken

  3. 监听 localStorage 变化,保证 token 实时同步

// 登录时设置 token
localStorage.setItem('token', 'your-token-value')// 监听 token 变化,保证新打开的页面能同步
window.addEventListener('storage', (event) => {if (event.key === 'token') {console.log('新 token:', event.newValue)}
})

优点

  • 实现简单

  • 无需后端支持

  • 适用于同一浏览器、同一域名下的多个系统

缺点

  • 不能跨浏览器、跨设备共享

  • 不能跨域名(如 a.com 无法共享 b.comtoken


🔹 方案 2:SSO + Cookie 共享(适用于跨子域)

适用于:跨子域(如 admin.example.comuser.example.com
💡 实现思路

  1. 后端设置 cookie,作用域为 *.example.com

  2. 前端所有子系统 访问 cookie 共享登录状态

  3. 跨域设置 SameSite=None; Secure

后端(Node.js 示例)

 
res.cookie('token', 'your-token', {domain: '.example.com', // 设置作用域path: '/',httpOnly: true,secure: true,sameSite: 'None' // 允许跨域
})

前端

fetch('https://auth.example.com/check-login', {credentials: 'include' // 允许跨域携带 Cookie
}).then(res => res.json()).then(data => {console.log('登录状态:', data)})

优点

  • 支持多个子域共享登录

  • 安全性较高

  • 用户体验好

缺点

  • 不能跨主域(如 example.com 不能共享 other.com

  • 需要 HTTPS

  • 浏览器 SameSite 限制较多


🔹 方案 3:OAuth 2.0 + JWT(适用于跨域、第三方登录)

适用于:多端、第三方应用、社交登录(如 Google、GitHub、微信)
💡 实现思路

  1. 用户在 SSO 服务器 登录,返回 token

  2. 其他系统使用 token 请求 SSO,获取用户信息

  3. 通过 OAuth 标准协议授权

前端 OAuth 登录

window.location.href = `https://sso.example.com/oauth/authorize?client_id=your-client-id&redirect_uri=${encodeURIComponent(window.location.href)}`

后端验证 token

app.get('/auth/user', async (req, res) => {const token = req.headers.authorization?.split(' ')[1]const user = verifyToken(token) // 解析 JWTres.json(user)
})

优点

  • 支持跨域、跨设备

  • 可用于第三方应用

  • 安全性高

缺点

  • 需要后端支持 OAuth 2.0

  • token 需要存 cookielocalStorage


🔹 方案 4:SSO + Redis + Session(适用于企业系统)

适用于:企业级 SSO(如钉钉、企业微信)
💡 实现思路

  1. 用户登录后,后端将 session 存入 Redis

  2. 不同系统请求 SSO,校验 session 是否有效

  3. 用户登出时,删除 Redis session

后端

const sessionStore = new Redis() // 连接 Redisapp.post('/login', (req, res) => {const token = generateToken(req.body.user)sessionStore.set(token, JSON.stringify(req.body.user), 'EX', 3600) // 存入 Redisres.json({ token })
})app.get('/check-session', async (req, res) => {const token = req.headers.authorization?.split(' ')[1]const session = await sessionStore.get(token)if (session) {res.json(JSON.parse(session))} else {res.status(401).json({ message: '未登录' })}
})

优点

  • 可以跨域、跨浏览器共享登录

  • 适用于大规模企业级系统

  • 支持 SSO 统一管理

缺点

  • 需要后端支持 Redis

  • 实现较复杂


📌 方案对比

方案适用范围共享方式安全性适合场景
localStorage同浏览器localStorage前端应用
BroadcastChannel同浏览器postMessage单页面应用
Cookie + SameSite跨子域cookie内部 SaaS 系统
OAuth 2.0 + JWT跨域、第三方token公共平台
SSO + Redis跨系统、跨浏览器session企业 SSO

🎯 最佳实践

  • 小型前端应用(SPA)localStorage + BroadcastChannel

  • 企业 SaaS(跨子域)Cookie + SameSite=None

  • 第三方登录(跨域)OAuth 2.0 + JWT

  • 企业级 SSO(跨浏览器、多系统)Redis + Session

推荐组合
SSO + OAuth 2.0 + Redis + JWT,适用于高安全性、多端登录

相关文章:

前端实现单点登录(SSO)的方案

概念:单点登录(Single Sign-On, SSO)主要是在多个系统、多个浏览器或多个标签页之间共享登录状态,保证用户只需登录一次,就能访问多个关联应用,而不需要重复登录。 💡 方案分类 1. 前端级别 SS…...

在 Blazor 中使用 Chart.js 快速创建数据可视化图表

前言 BlazorChartjs 是一个在 Blazor 中使用 Chart.js 的库(支持Blazor WebAssembly和Blazor Server两种模式),它提供了简单易用的组件来帮助开发者快速集成数据可视化图表到他们的 Blazor 应用程序中。本文我们将一起来学习一下在 Blazor 中…...

SQL server 2022和SSMS的使用案例1

一,案例讲解 二,实战讲解 实战环境 你需要确保你已经安装完成SQL Server 2022 和SSMS 20.2 管理面板。点此跳转至安装教程 SQL Server2022Windows11 专业工作站SSMS20.2 1,连接数据库 打开SSMS,连接数据库。 正常连接示意图&…...

【每日算法】Day 16-1:跳表(Skip List)——Redis有序集合的核心实现原理(C++手写实现)

解锁O(log n)高效查询的链表奇迹!今日深入解析跳表的数据结构设计与实现细节,从基础概念到Redis级优化策略,彻底掌握这一平衡树的优雅替代方案。 一、跳表核心思想 跳表(Skip List) 是一种基于多层有序链表的概率型数…...

前沿科技:3D生成领域技术与应用分析

以下是关于3D生成领域的详细分析,涵盖技术发展、应用场景、挑战与未来趋势、市场动态及典型案例: 一、技术发展与核心方法 3D表示方法 显式表示:包括点云、网格(三角形或四边形)和分层深度图像(LDI),适合直接操作和渲染,但细节复杂度高。 隐式表示:如神经辐射场(NeR…...

Spring Boot 3.4.3 基于 JSqlParser 和 MyBatis 实现自定义数据权限

前言 在企业级应用中,数据权限控制是保证数据安全的重要环节。本文将详细介绍如何在 Spring Boot 3.4.3 项目中结合 JSqlParser 和 MyBatis 实现灵活的数据权限控制,通过动态 SQL 改写实现多租户、部门隔离等常见数据权限需求。 一、环境准备 确保开发环境满足以下要求: …...

GO语言学习(14)GO并发编程

目录 🌈前言 1.goroutine🌟 2.GMP模型🌟 2.1 GMP的由来☀️ 2.2 什么是GMP☀️ 3.channel 🌟 3.1 通道声明与数据传输💥 3.2 通道关闭 💥 3.3 通道遍历 💥 3.4 Select语句 &#x1f4…...

【Audio开发二】Android原生音量曲线调整说明

一,客制化需求 客户方对于音量加减键从静音到最大音量十五个档位区域的音量变化趋势有定制化需求。 二,音量曲线调试流程 Android根据不同的音频流类型定义不同的曲线,曲线文件存放在/vendor/etc/audio_policy_volumes.xml或者default_volu…...

sass报错,忽略 Sass 弃用警告,降级版本

最有效的方法是创建一个 .sassrc.json 文件来配置 Sass 编译器。告诉 Sass 编译器忽略来自依赖项的警告消息。 解决方案: 1. 在项目根目录创建 .sassrc.json 文件: {"quietDeps": true }这个配置会让 Sass 编译器忽略所有来自依赖项&#x…...

spring-security原理与应用系列:HttpSecurity.filters

目录 AnyRequestMatcher WebSecurityConfig HttpSecurity AbstractInterceptUrlConfigurer AbstractAuthenticationProcessingFilter 类图 在前面的文章《spring-security原理与应用系列:securityFilterChainBuilders》中,我们遗留了一个问题&…...

JVM生产环境问题定位与解决实战(六):总结篇——问题定位思路与工具选择策略

本文已收录于《JVM生产环境问题定位与解决实战》专栏,完整系列见文末目录 引言 在前五篇文章中,我们深入探讨了JVM生产环境问题定位与解决的实战技巧,从基础的jps、jmap、jstat、jstack、jcmd等工具,到JConsole、VisualVM、MAT的…...

数据仓库项目启动与管理

数据仓库项目启动与管理 确定项目 评估项目就绪情况 项目就绪的三个条件 强力型高级业务管理发起人 对数据仓库解决方案的影响有先见之明是所在组织内有影响的领导者要求严格,但是又比较现实,会为其他成员提供强力支持 强制型业务动机 数据仓库系统和战略性业务动机紧密结合…...

并行治理机制对比:Polkadot、Ethereum 与 NEAR

治理是任何去中心化网络的基础。它塑造了社区如何发展、如何为创新提供资金、如何应对挑战以及如何随着时间的推移建立信任。随着 Web3 的不断发展,决定这些生态系统如何做出决策的治理模型也在不断发展。 在最近的一集的【The Decentralized Mic】中, Polkadot 汇…...

利用 PHP 爬虫按关键字搜索淘宝商品

在当今数字化时代,网络爬虫技术已成为获取网络数据的重要手段之一。淘宝作为国内最大的电商平台之一,拥有海量的商品信息。通过 PHP 爬虫技术,我们可以实现按关键字搜索并抓取淘宝商品信息。以下将详细介绍如何使用 PHP 实现这一功能。 一、…...

在未归一化的线性回归模型中,特征的尺度差异可能导致模型对特征重要性的误判

通过数学公式来更清晰地说明归一化对模型的影响,以及它如何改变特征的重要性评估。 1. 未归一化的情况 假设我们有一个线性回归模型: y β 0 β 1 x 1 β 2 x 2 ϵ y \beta_0 \beta_1 x_1 \beta_2 x_2 \epsilon yβ0​β1​x1​β2​x2​ϵ 其…...

TDengine tar.gz和docker两种方式安装和卸载

下载地址 3.1.1.0 Linux版本 安装包 下载地址 3.1.1.0 docker 镜像 下载地址 3.1.1.0 Window客户端 1. 将文件上传至服务器后解压 tar -zxvf TDengine-server-3.1.1.0-Linux-x64.tar.gz 2. tar.gz安装 解压文件后,进入相应子目录,执行其中的 install.…...

【STM32设计】基于STM32的智能门禁管理系统(指纹+密码+刷卡+蜂鸣器报警)(代码+资料+论文)

本课题为基于单片机的智能门禁系统,整个系统由AS608指纹识别模块,矩阵键盘,STM32F103单片机,OLED液晶,RFID识别模块,继电器,蜂鸣器等构成,在使用时,用户可以录入新的指纹…...

贪心算法,其优缺点是什么?

什么是贪心算法? 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最优(局部最优)的选择,从而希望导致全局最优解的算法策略。 它不像动态规划那样考虑所有可能的子问题,而是做出局部最优选择,依赖这些选择来…...

java知识梳理(二)

一.lambda表达式 作用:Lambda 表达式在 Java 8 引入,主要用于简化匿名内部类的写法,特别是在函数式编程场景中,比如 函数式接口、流式 API(Streams)、并发编程等。它让 Java 代码更简洁、可读性更强&#x…...

鸿蒙Flutter实战:20. Flutter集成高德地图,同层渲染

本文以同层渲染为例,介绍如何集成高德地图 完整代码见 Flutter 鸿蒙版 Demo 概述 Dart 侧 核心代码如下,通过 OhosView 来承载原生视图 OhosView(viewType: com.shaohushuo.app/customView,onPlatformViewCreated: _onPlatformViewCreated,creation…...

c++中%符号使用的注意事项/易错点

在C中,% 是取模运算符(modulus operator),用于计算两个数相除后的余数。虽然它的用法看起来简单,但在实际编程中有一些需要注意的细节和易错点。以下是关键注意事项: 1. 操作数必须为整数类型 % 只能用于整…...

AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用

目前,流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型,能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…...

Java 基础-30-单例设计模式:懒汉式与饿汉式

在软件开发中,单例设计模式(Singleton Design Pattern)是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于管理共享资源(如数据库连接池、线程池等)或需要…...

尚语翻译图册翻译|专业图册翻译|北京专业翻译公司推荐|专业文件翻译报价

内容概要 尚语翻译公司聚焦多语种产品图册翻译的竞价推广服务,通过行业垂直化运营构建差异化竞争力。其核心服务覆盖机械制造、医疗器械、电子元件三大领域,依托ISO 17100认证的翻译流程和Trados术语管理系统,实现技术文档的精准转化。为提升…...

杂篇-行业分类一二-2(通、专用设备制造,汽车制造)

接上篇, 本篇列举制造业中另外几个细分行业:通用设备制造,专用设备制造,汽车制造业。 一、通用设备制造 分类 序号 类别名称 说明 1 锅炉及原动设备制造 1 锅炉及辅助设备制造 指各种蒸汽锅炉、汽化锅炉,以及…...

[笔记.AI]大模型训练 与 向量值 的关系

(借助 DeepSeek-V3 辅助生成) 大模型在训练后是否会改变向量化的值,取决于模型的训练阶段和使用方式。以下是详细分析: 1. 预训练阶段:向量化值必然改变 动态调整过程: 在预训练阶段(如BERT、…...

LeetCode 解题思路 30(Hot 100)

解题思路: 递归参数: 生成括号的对数 n、结果集 result、当前路径 path、左括号数 open、右括号数 close。递归过程: 当当前路径 path 的长度等于 n * 2 时,说明已经生成有效括号,加入结果集。若左括号数小于 n&…...

Java EE(18)——网络原理——应用层HTTP协议

一.初识HTTP协议 HTTP(HyperText Transfer Protocol,超文本传输协议)是用于在客户端(如浏览器)和服务器之间传输超媒体文档(如HTML)的应用层协议。 HTTP协议发展至今发布了多个版本,其中1.0,1.…...

强大而易用的JSON在线处理工具

强大而易用的JSON在线处理工具:程序员的得力助手 在当今的软件开发世界中,JSON(JavaScript Object Notation)已经成为了数据交换的通用语言。无论是前端还是后端开发,我们都经常需要处理、验证和转换JSON数据。今天&a…...

Qt笔记----》不同环境程序打包

文章目录 概要1、windows环境下打包qt程序2、linux环境下打包qt程序2.1、程序目录2.2、创建一个空文件夹2.3、添加依赖脚本2.4、打包过程2.4.1、添加程序依赖库2.4.2、添加Qt相关依赖库 概要 qt不同运行环境下打包方式:windows/linux 1、windows环境下打包qt程序 …...