Spring Boot 实现单点登录(SSO)的四种方案

91 阅读5分钟

沉默是金,总会发光

大家好,我是沉默

单点登录(Single Sign-On,简称SSO)就像企业应用的万能钥匙,让用户用一组账号密码,一次登录,就能畅游多个相关系统,不用反复输入密码。对于有多个应用的企业,这不仅极大提升用户体验,还能降低管理密码的麻烦和风险。

今天,我们用最通俗的语言,深度剖析几种主流SSO方案,帮你选对技术,快速落地!

**-**01-

基于Cookie-Session的传统SSO

原理:

想象一下,你在公司大厦大门口登记进去了,门卫给你发了个带有编号的腕带(Session ID)。你走进不同的办公室时,只要出示腕带,保安都知道你是合法员工,不用再重新登记。

技术上,用户登录SSO服务器后,服务器保存登录状态在服务端Session里,并把Session ID放进顶级域名下的Cookie。这样,所有子系统都能读取这个Cookie,判断你已经登录。

代码示例:

  • 服务端:登录时创建Session,设置Cookie,标记用户身份。

  • 客户端:每次请求都检查是否有SSO Session Cookie,如果没有跳转登录,验证后创建本地Session。

// 服务器端创建Session并设置Cookie,Cookie域名为 .example.com,实现跨子域共享
Cookie cookie = new Cookie("SSO_SESSION_ID", session.getId());
cookie.setDomain(".example.com");
cookie.setHttpOnly(true);
cookie.setSecure(true);
response.addCookie(cookie);

优缺点:

  • 优点

  • 简单易实现,符合传统Web开发习惯

  • 服务端可控,会话失效能即时生效

  • 缺点

  • 只能同一顶级域名下用(子域共享Cookie)

  • Cookie受限于浏览器,移动端支持有限

  • 有一定CSRF风险,需要额外防护

**-**02-

基于 JWT 的无状态现代SSO

原理:

JWT(JSON Web Token)就像是一张“数字通行证”,上面写满了你的身份信息和签名。认证服务器发给你这个通行证,你去哪个系统都能凭它证明身份,无需每次都去服务端查状态。

代码示例:

  • 登录后,认证服务生成签名过的JWT,包含用户ID、角色等信息。

  • 各客户端接收JWT,后续请求都带着它,后端通过验证签名确认用户身份。

  • 不需要服务端保存会话状态,完全无状态。

服务端登录生成JWT:

String jwt = jwtUtil.generateToken(user);

客户端携带JWT访问各系统:

axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;

优缺点:

  • 优点

  • 跨域无障碍,特别适合微服务架构和前后端分离

  • 不依赖Cookie,减少CSRF攻击风险

  • 支持各种客户端:Web、移动APP、API调用

  • 缺点

  • 令牌无法即时撤销(除非加黑名单)

  • JWT体积相对较大,网络传输成本增加

  • 需要在客户端做好令牌安全管理和刷新机制

**-**03-

企业级OAuth 2.0 + OpenID Connect

原理:

OAuth 2.0 是授权框架,OpenID Connect(OIDC)是在OAuth基础上的认证层。它就像银行的“统一身份认证中心”,支持复杂的授权流程和第三方接入,安全性和灵活性都很高。

代码示例:

  • 搭建授权服务器,支持多种授权模式(密码模式、授权码模式、刷新令牌等)。

  • 资源服务器负责保护各业务接口。

  • 客户端通过标准协议进行认证授权,拿到访问令牌后访问资源。

授权服务器配置:

@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    // 配置客户端、令牌生成与增强
}

客户端配置:

spring:
  security:
    oauth2:
      client:
        registration:
          custom:
            client-id: web-client
            client-secret: secret
            authorization-grant-type: authorization_code
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"

优缺点:

  • 优点

  • 最成熟的行业标准,安全性高

  • 令牌撤销机制完善,支持多租户和多客户端

  • 认证与授权职责明确,扩展性极强

  • 缺点

  • 实现复杂,学习成本高

  • 小型项目可能“杀鸡用牛刀”

**-**04-

基于 Spring Session 的分布式 SSO

原理:

Spring Session 就像一个大家共用的会话仓库,把会话数据放到Redis等共享存储。不同应用访问时,都从同一个地方读取用户会话,实现统一登录状态。

代码示例:

  • 引入Spring Session + Redis依赖

  • 配置统一的Session存储和Cookie策略

  • 各应用配置统一认证过滤器,验证共享Session

@EnableRedisHttpSession
public class SessionConfig {
    @Bean
    public LettuceConnectionFactory connectionFactory() {
        return new LettuceConnectionFactory(redisConfig);
    }
}

优缺点:

  • 优点

  • 与Spring生态无缝集成,开发简单

  • 共享Session支持复杂会话信息

  • 缺点

  • 依赖Redis等中央存储

  • Cookie机制仍需依赖,限制非Web应用场景

**-**05-

如何选?

| 方案类型

|

适用场景

|

不适用场景

| | --- | --- | --- |

Cookie-Session同域名小型应用,简单需求跨域、多端、移动App
JWT分布式微服务,跨域,移动端需要即时令牌撤销的高安全场景
OAuth 2.0/OIDC企业级、多租户,第三方集成小型快速开发,资源受限
Spring SessionSpring生态,中型企业应用异构技术栈,非Web应用

总结:

单点登录的世界里,没有万能钥匙,只有最适合的那把。

  • 想快速落地、简单管理,同域Cookie-Session就够用。

  • 追求分布式、跨端无状态,JWT轻装上阵。

  • 需要企业级安全保障和第三方扩展,OAuth2.0/OIDC是首选。

  • 使用Spring生态的企业,中型应用可优先考虑Spring Session方案。

选对方案,不仅提升用户体验,更能保证系统安全与维护便利。

希望本文能帮你少走弯路,打造稳定、高效的SSO体系!

热门文章

一套能保命的高并发实战指南

架构师必备:用 AI 快速生成架构图

**-**05-

粉丝福利

我这里创建一个程序员成长&副业交流群,和一群志同道合的小伙伴,一起聚焦自身发展,可以聊:技术成长与职业规划,分享路线图、面试经验和效率工具,探讨多种副业变现路径,从写作课程到私活接单,主题活动、打卡挑战和项目组队,让志同道合的伙伴互帮互助、共同进步。如果你对这个特别的群,感兴趣的,可以加一下,微信通过后会拉你入群,但是任何人在群里打任何广告,都会被我T掉。