单点登录(SSO)到底怎么实现?怎么判断用户是否已单点登录?

周五下午,实习生小刘攥着面试笔记冲进工位,脸涨得通红:"杨哥!我明天面试必被问单点登录,你快给我讲讲怎么实现、怎么判断用户是不是单点登录!"

杨工刚泡好一杯茶,笑着拉过椅子:"别急,咱们用你上周做的校园二手交易平台项目打比方,讲完你保准能讲给面试官听。"

一、为什么需要单点登录?

"你现在有三个系统:二手交易主站、校园论坛、社团报名系统,每个系统都独立部署,用户每次切换都要重新输账号密码,烦不烦?"

小刘点头:"对,我之前每个项目都单独写登录拦截器,跳来跳去要登三次。"

"这就是没做单点登录。"杨工在白板上画了个方框,"我们抽一个独立的认证中心,所有登录相关的事都归它管,三个业务系统谁都不存密码,只认认证中心发的凭证。"

单点登录(Single Sign-On,SSO)的核心思想:在多个相互信任的系统中,用户只需要登录一次,就可以访问所有受信任的系统,无需重复认证。

二、单点登录怎么实现?

杨工接着画流程,小刘跟着笔尖一步步看:

2.1 核心角色

角色 职责 在你项目里的对应
用户(Browser) 发起请求、携带凭证 访问网站的浏览器
业务系统(SP) 提供具体服务,校验本地会话 二手主站、论坛、报名系统
认证中心(IdP) 统一认证,管理全局会话,签发凭证 独立部署的登录服务

2.2 首次访问:建立全局会话

"用户第一次访问二手主站,主站的拦截器发现你没有本地会话,直接把你重定向到认证中心。认证中心看你也没全局会话,就弹出登录页,你输完账号密码验证通过,它做三件事:"

  1. 在自己服务器存一个全局会话 TGT(Ticket Granting Ticket),记住你登过录了。
  2. 往你浏览器写一个 TGC 的 Cookie(Ticket Granting Cookie),下次你来它能认出你。
  3. 生成一个一次性的 ST 票据(Service Ticket),把你带回主站。

"主站拿到 ST 后,后端偷偷去认证中心核验,确认没问题就给你建本地会话(Session 或 Token),你就能正常逛平台了。"

2.3 访问第二个系统:免密进入

小刘赶紧记笔记:"那我去访问论坛的时候呢?"

"这就是单点登录的精髓。"杨工敲了敲白板,"你访问论坛,论坛拦截器发现你没本地会话,也把你重定向到认证中心。这时候你浏览器会自动带上之前认证中心写的 TGC Cookie ,认证中心一查,发现对应的 TGT 还在,就知道你已经在主站登过录了,根本不用你再输密码,直接给论坛发一个新的 ST 票据,论坛核验完给你建本地会话,你就直接进去了。"

2.4 数据流转总结

复制代码
用户 → 业务系统A(无本地会话)→ 重定向到认证中心
认证中心(无全局会话)→ 用户登录 → 创建TGT + 写TGC Cookie + 签发ST
用户带ST回到A → A后端去认证中心核验ST → 建立A的本地会话

用户 → 业务系统B(无本地会话)→ 重定向到认证中心
认证中心(有TGC → 查到TGT)→ 直接签发新ST(无需登录)
用户带ST回到B → B后端去认证中心核验ST → 建立B的本地会话

三、怎么判断用户是否是单点登录?

小刘眼睛亮了:"我懂了!判断用户是不是单点登录,就是看认证中心有没有存他的全局会话 TGT,有的话就不用重新登录,直接发新票据;没有的话就得重新输密码。"

"完全正确。"杨工补充道,"面试官问你具体怎么判断,你就分两层说:"

3.1 第一层:判断本地是否登录

业务系统先查自己的本地会话:

  • Session 方案:查本地 Session 是否存在。
  • Token 方案:解析请求里的 Token,校验签名、有效期、用户 ID。
  • JWT 方案:校验 JWT 是否合法、是否过期、是否在黑名单中。

如果本地会话存在,说明用户在当前系统已经登录,直接放行,不需要去认证中心。

3.2 第二层:判断全局是否登录

如果本地没有会话,就要去认证中心判断:

  • 把用户重定向到认证中心,浏览器自动携带 TGC Cookie。
  • 认证中心根据 TGC 查找对应的 TGT(全局会话)。
  • TGT 存在且有效 → 用户处于单点登录状态,直接签发新 ST,免密进入。
  • TGT 不存在或已过期 → 用户未登录,展示登录页要求重新认证。

一句话总结:本地有会话 → 当前系统已登录;本地没有但认证中心有全局会话 → 单点登录,免密进入;两边都没有 → 未登录,需要重新认证。

四、几个容易踩的坑

4.1 票据是一次性的,不能复用

ST(Service Ticket)用完就作废,就算被人截获也没法重复使用。真正"还在"的是全局会话 TGT,它通过浏览器里的 TGC Cookie 被认证中心识别。

4.2 JWT / Redis Token 本身不是 SSO

JWT 和 Redis Token 只是登录凭证,解决的是"单个系统怎么记住用户"。只有当你把登录入口抽出来,变成一个所有系统都信任的认证中心,才叫单点登录。

4.3 拦截器也不是 SSO

拦截器只是"门卫",负责检查请求有没有凭证。它既可以配合 Session 用,也可以配合 JWT 用,也可以配合 SSO 用。

4.4 单点登出要同步销毁

认证中心销毁全局会话后,还要通知各业务系统销毁本地会话,否则会出现"认证中心已退出,但某个系统还能访问"的情况。

五、面试怎么答?

杨工最后拍了拍小刘的肩膀:"明天面试官问你,你就按这个结构答:"

  1. 先说概念:单点登录是在多个系统中只需登录一次即可访问所有受信任系统。
  2. 再说实现:抽一个独立认证中心,业务系统无本地会话时重定向到认证中心,认证中心通过 TGT/TGC 管理全局会话,签发一次性 ST 票据,业务系统后端核验后建立本地会话。
  3. 最后说判断:分两层,先查本地会话,没有再去认证中心查全局会话,有就是单点登录状态。
  4. 补一句安全:票据一次性、后端核验、签名防篡改。

"记住一句话:单点登录不是系统之间互相传用户信息,而是所有系统共同信任一个发证机构。 明天面试稳了。"

小刘合上笔记本,长舒一口气:"这下我明天面试能讲明白了!原来单点登录就是把登录的活抽给一个专门的认证中心,所有系统都信它,用户只要登一次,所有系统都能认。"

相关推荐
深入云栈2 小时前
Netty 4.2.x 源码深度解析 (十八):ChannelOutboundBuffer 写缓冲区 —— 发送队列与流量控制
java·后端·架构
代码山河2 小时前
第一个Java程序:Hello World从零编写与运行
java·学习·架构·教程·面向对象·项目
鶴哥只手遮天2 小时前
AFSIM 架构解剖(上):内核与运行机理
架构
鶴哥只手遮天3 小时前
AFSIM 架构解剖(下):专业领域与生态
架构
CoLiuRs3 小时前
订单不是一张表:订单聚合与状态机
数据库·架构
狂奔蜗牛(bradley)3 小时前
EtherCAT 主站拓扑判定的三级防护:从去抖到振荡检测
人工智能·嵌入式硬件·fpga开发·架构
WindrunnerMax4 小时前
以轻量 LoopAgent 替代 RAG 实现文档检索
人工智能·架构·github
天远Date Lab4 小时前
零信任架构实战:基于天远风控经营异常预警构建自动化商业园区租户巡检网关
大数据·人工智能·架构·自动化
范中勤4 小时前
适配器模式(Adapter Pattern):原理、场景与 LLM 多厂商工程落地
设计模式·架构·langchain·适配器模式·多厂商