Spring中保存历史认证:Service-Y不可用时已认证用户登录Service-X方案
应对SSO服务不可用时的本地登录方案
刚好之前做过类似的内部SSO高可用架构,针对你说的「用户已在Service-X完成过认证,当Service-Y不可用时仍能登录」的需求,分享几个可行的方案:
1. 本地缓存加密会话令牌
当用户首次通过Service-Y完成SSO登录后,Service-X可以生成一个加密的、带有效期的本地会话令牌,和用户的身份ID、权限信息绑定后存储(可以存在Cookie或后端Redis里)。
- 当检测到Service-Y不可用时,Service-X直接校验本地令牌:如果令牌未过期且签名合法,就直接放行登录,不需要再调用SSO接口。
- 注意点:令牌必须用对称加密(比如AES)或非对称签名(比如RSA)保证不可篡改,有效期建议设得比SSO会话短(比如24小时),同时提供手动注销按钮,让用户能主动失效本地会话。
2. 隐藏式应急登录入口(仅限内部场景)
提前在Service-X里做一个隐藏的应急登录页面,只对公司内部IP段开放,或者需要额外验证:
- 可以让用户在Service-Y正常时,提前设置一个应急登录密码,加密存储在Service-X的本地数据库里;或者由管理员批量生成临时凭证分发给员工。
- 当SSO挂了,用户可以通过这个入口输入工号+应急密码登录,Service-X直接校验本地存储的凭证。
- 注意点:这个入口一定要做严格的访问控制,比如限制内部IP、加验证码,防止外部攻击;并且在Service-Y恢复后,自动禁用这个入口,强制切回SSO认证。
3. 会话持久化+自动降级策略
如果Service-X用的是分布式会话(比如Redis集群),可以在用户SSO登录成功后,把用户的核心身份信息(用户ID、角色、过期时间)持久化到本地会话中:
- 后台加一个Service-Y的健康检查脚本,定时探测SSO接口的可用性。一旦检测到不可用,自动切换到降级模式,直接读取本地会话的用户信息做鉴权。
- 等Service-Y恢复后,自动切回正常流程,并且强制用户重新走SSO认证,更新本地会话信息。
4. 预缓存用户基础身份信息
在Service-Y可用时,要么定期同步所有员工的基础信息(工号、部门、权限)到Service-X的本地缓存,要么在用户每次登录时,预取并缓存这些信息:
- 当SSO不可用时,结合本地的会话令牌,直接用缓存的用户信息完成登录和权限校验。
- 注意点:缓存的信息要设置合理的过期时间,并且在Service-Y恢复后立即触发同步,避免用户信息不一致。
额外提醒
- 所有本地存储的凭证、用户信息都必须加密存储,防止数据泄露。
- 降级模式下的所有登录操作都要详细打日志,方便后续审计排查。
- 一定要提前做故障演练,模拟Service-Y不可用的场景,确保降级流程能正常跑通。
内容的提问来源于stack exchange,提问作者e1sordo
相关产品推荐
相关产品推荐

