如果面试被问到单点登录,你会怎么回答?
如果面试被问到单点登录,你会怎么回答?
作者:一位 Java 老猿,写代码第八年,头发还剩三根半
前言:这题我熟,我头发少不代表我不会!
在经历无数次面试之后,我总结出一个规律:只要你简历上写了“参与系统架构设计”,面试官就一定会在某个时刻扶了扶眼镜,问你一句:
“那你说说,咱们系统的单点登录(SSO)是怎么做的?”
这时候,年轻的程序员可能一脸懵逼,脑海里浮现的是“登录一次能多次免密登录?”,而经验老辣的 Java 开发(比如我)早已微微一笑,默默打开脑海里的架构图工具,开始输出!
一、什么是单点登录,别装不认识
先别急着讲实现,定义要先讲清楚,不然面试官会觉得你是在背八股。
SSO 是什么?
Single Sign-On,简称 SSO,指的是用户在多个系统之间切换时,只需要登录一次,就可以访问所有系统,无需重复登录。
通俗点说:你进了公司大门(登录一次),就可以在不同楼层(系统)自由蹦跶,不需要每层都刷卡。
二、SSO 的实现原理,画个图脑子就清楚了
(当然面试现场你不能真画图,但你要能用嘴“画”出来)
核心思路:认证中心 + 信任机制
- 用户访问系统 A:没登录,重定向到认证中心(SSO Server)。
- 认证中心让用户登录:登录成功后,生成一个 Token(比如 JWT 或 SessionId 等)。将 Token 存储在认证中心(可放 Redis,Session 等)。
- 认证中心重定向回系统 A:携带刚生成的 Token。
- 系统 A 拿 Token 去认证中心验证:成功后给用户发自己的 Session 或 Cookie。
用户再访问系统 B:
- 系统 B 也发现没登录 → 重定向到认证中心;
- 认证中心发现用户已经登录 → 直接放行,不用再输密码;
- 系统 B 拿到 Token,验证通过后建立自己的会话。
跳板机会
技术大厂机会,前端-后端-测试,base多地,待遇还可以~
三、实现方式有哪些?面试要讲“姿势”!
1. Cookie 共享法(局限大,不推荐)
- 只适用于同一主域名下的子系统。
- 通过设置 Cookie 的
domain=.yourdomain.com
实现共享。
缺点: 跨域就GG,没法玩。
2. Token + 认证中心(主流做法)
- 基于 JWT 或 Session ID。
- 所有系统都信任同一个认证中心(SSO Server)。
- 系统之间通过后端接口或前端重定向完成身份验证。
常见技术栈:
- Java 后端:Spring Boot + Redis + JWT
- 前端:携带 Token 访问,或 Cookie 自动携带
- 网关:Nginx、Spring Cloud Gateway 做统一拦截
四、SSO 常见问题,别说你没踩过坑
1. Token 如何失效?
- 设置过期时间(TTL),或用户主动注销;
- Redis 存储 Token,加个
expire
; - JWT 的
exp
字段也能控制。
2. 如何实现注销登录?
- 单点登出(Single Logout,SLO)实现起来比较复杂。
- 通常做法是:用户发出注销请求,认证中心通知所有子系统清除本地会话。
最暴力但有效的做法:
- Token 加入黑名单;
- 或直接删掉 Redis 中的 Token。
五、Spring Security + OAuth2 就能搞定 SSO?
答:能,但你得会配!
- Spring Security OAuth2 提供了完整的授权、认证机制;
- 可以搭建一个认证服务器(Authorization Server);
- 系统 A 和系统 B 都作为 Resource Server,只要验证 Token 即可。
六、面试官最爱问的灵魂问题:你们为什么要做 SSO?
别直接说“为了用户方便登录”,太表面。正确答法是:
- 提高用户体验:避免重复登录;
- 提高安全性:统一认证,统一注销;
- 降低系统耦合:各系统不再自己管理用户系统;
- 便于权限管理:可以结合统一的权限平台做 RBAC 控制。
七、总结:回答要套路,真懂才靠谱
面试回答模板(建议默背):
“我们是使用基于 Token 的 SSO 实现方式,搭建了一个统一的认证中心,用户首次登录后会生成一个全局 Token,后续访问其他系统会通过该 Token 验证身份,整个过程使用了 JWT + Redis + Spring Boot 实现。我们也做了单点登出机制,确保用户注销后所有系统都同步退出。”
说完,微笑,然后喝口水,看面试官点头。
尾声:别怕面试官,他怕你讲得太细
SSO 不是玄学,也不是玄幻小说,掌握原理 + 实战经验,回答时有层次、有细节、有态度,就赢了。
愿你下次面试,聊起 SSO,眼神中自带光芒,让面试官怀疑人生:“这哥们不会是来挖我架构的吧?”
——转载自:天天摸鱼的java工程师
#牛客创作赏金赛#