周五下午,实习生小刘攥着面试笔记冲进工位,脸涨得通红:"杨哥!我明天面试必被问单点登录,你快给我讲讲怎么实现、怎么判断用户是不是单点登录!"
杨工刚泡好一杯茶,笑着拉过椅子:"别急,咱们用你上周做的校园二手交易平台项目打比方,讲完你保准能讲给面试官听。"
一、为什么需要单点登录?
"你现在有三个系统:二手交易主站、校园论坛、社团报名系统,每个系统都独立部署,用户每次切换都要重新输账号密码,烦不烦?"
小刘点头:"对,我之前每个项目都单独写登录拦截器,跳来跳去要登三次。"
"这就是没做单点登录。"杨工在白板上画了个方框,"我们抽一个独立的认证中心,所有登录相关的事都归它管,三个业务系统谁都不存密码,只认认证中心发的凭证。"
单点登录(Single Sign-On,SSO)的核心思想:在多个相互信任的系统中,用户只需要登录一次,就可以访问所有受信任的系统,无需重复认证。
二、单点登录怎么实现?
杨工接着画流程,小刘跟着笔尖一步步看:
2.1 核心角色
| 角色 | 职责 | 在你项目里的对应 |
|---|---|---|
| 用户(Browser) | 发起请求、携带凭证 | 访问网站的浏览器 |
| 业务系统(SP) | 提供具体服务,校验本地会话 | 二手主站、论坛、报名系统 |
| 认证中心(IdP) | 统一认证,管理全局会话,签发凭证 | 独立部署的登录服务 |
2.2 首次访问:建立全局会话
"用户第一次访问二手主站,主站的拦截器发现你没有本地会话,直接把你重定向到认证中心。认证中心看你也没全局会话,就弹出登录页,你输完账号密码验证通过,它做三件事:"
- 在自己服务器存一个全局会话 TGT(Ticket Granting Ticket),记住你登过录了。
- 往你浏览器写一个 TGC 的 Cookie(Ticket Granting Cookie),下次你来它能认出你。
- 生成一个一次性的 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 单点登出要同步销毁
认证中心销毁全局会话后,还要通知各业务系统销毁本地会话,否则会出现"认证中心已退出,但某个系统还能访问"的情况。
五、面试怎么答?
杨工最后拍了拍小刘的肩膀:"明天面试官问你,你就按这个结构答:"
- 先说概念:单点登录是在多个系统中只需登录一次即可访问所有受信任系统。
- 再说实现:抽一个独立认证中心,业务系统无本地会话时重定向到认证中心,认证中心通过 TGT/TGC 管理全局会话,签发一次性 ST 票据,业务系统后端核验后建立本地会话。
- 最后说判断:分两层,先查本地会话,没有再去认证中心查全局会话,有就是单点登录状态。
- 补一句安全:票据一次性、后端核验、签名防篡改。
"记住一句话:单点登录不是系统之间互相传用户信息,而是所有系统共同信任一个发证机构。 明天面试稳了。"
小刘合上笔记本,长舒一口气:"这下我明天面试能讲明白了!原来单点登录就是把登录的活抽给一个专门的认证中心,所有系统都信它,用户只要登一次,所有系统都能认。"