Spring Security OAuth2

Spring Security 对 OAuth2 提供了很好的支持,这使得我们在 Spring Security中使用 OAuth2 非常方便。然而由于历史原因,Spring Security 对 OAuth2 的支持比较混乱,这里简单梳理一下。

大约十年前,Spring 引入了一个社区驱动的开源项目 Spring Security OAuth,并将其纳入 Spring 项目组合中。到今天为止,这个项目已经发展成为一个成熟的项目,可以支持大部分 OAuth 规范,包括资源服务器、客户端和授权服务器等。

然而早期的项目存在一些问题,例如:

  • OAuth 是在早期完成的,开发者无法预料未来的变化以及这些代码到底要被怎么使用,这导致很多 Spring 项目提供了自己的 OAuth 支持,也就带来了 OAuth 支持的碎片化。

  • 最早的 OAuth 项目同时支持 OAuth1.0 和 OAuth2.0,而现在 OAuth1.0 早已经不再使用,可以放弃了。

现在我们有更多的库可以选择,可以在这些库的基础上去开发,以便更好地支持 JWT 等新技术。

基于以上这些原因,官方决定重写 Spring Security OAuth,以便更好地协调 Spring 和 OAuth,并简化代码库,使 Spring 的 OAuth 支持更加灵活。

然而,在重写的过程中,发生了不少波折。

2018 年 1 月 30 日,Spring 官方发了一个通知,表示要逐渐停止现有的 OAuth2 支持,然后在 Spring Security 5 中构建下一代 OAuth2.0 支持。这么做的原因是因为当时 OAuth2 的落地方案比较混乱,在 Spring Security OAuth、Spring Cloud Security、Spring Boot 1.5.x 以及当时最新的 Spring Security 5.x 中都提供了对 OAuth2 的实现。以至于当开发者需要使用 OAuth2 时, 不得不问,到底选哪一个依赖合适呢?

所以 Spring 官方决定有必要将 OAuth2.0 的支持统一到一个项目中,以便为用户提供明确的选择,并避免任何潜在的混乱,同时 OAuth2.0 的开发文档也要重新编写,以方便开发人员学习。所有的决定将在 Spring Security 5 中开始,构建下一代 OAuth2.0 的支持。

从那个时候起,Spring Security OAuth 项目就正式处于维护模式。官方将提供至少一年的错误/安全修复程序,并且会考虑添加次要功能,但不会添加主要功能。同时将 Spring Security OAuth 中的所有功能重构到 Spring Security 5.x 中。

到了 2019 年 11 月 14 日,Spring 官方又发布一个通知,这次的通知首先表示 Spring Security OAuth 在迁往 Spring Security 5.x 的过程非常顺利,大部分迁移工作已经完成了,剩下的将在 5.3 版本中完成迁移,在迁移的过程中还添加了许多新功能,包括对 OpenID Connect1.0 的支持。同时还宣布将不再支持授权服务器,不支持的原因有两个:

  1. 在 2019 年,已经有大量的商业和开源授权服务器可用。

  2. 授权服务器是使用一个库来构建产品,而 Spring Security 作为框架,并不适合做这件事情。

一石激起千层浪,许多开发者表示对此难以接受。这件事也在 Spring 社区引发了激烈的讨论,好在 Spring 官方愿意倾听来自社区的声音。

到了2020 年 4 月 15 日,Spring 官方宣布启动 Spring Authorization Server 项目。这是一个由 Spring Security 团队领导的社区驱动的项目,致力于向 Spring 社区提供 Authorization Server 支持,也就是说,Spring 又重新支持授权服务器了。

2020 年 8 月 21 日,Spring Authorization Server 0.0.1 正式发布!

现在读者了解了 OAuth2 在 Spring 家族中的发展历程了。本章后面的案例中,客户端和资源服务器都将采用最新的方式来构建,授权服务器依然采用旧的方式来构建,因为目前的 Spring Authorization Server 0.0.1 功能较少且 BUG 较多。

一般来说,当我们在项目中使用 OAuth2 时,都是开发客户端,授权服务器和资源服务器都是由外部提供。例如我们想在 www.javaboy.org 这个网站上集成 GitHub 第三方登录,只需要开发自已的客户端即可,认证服务器和授权服务器都是由 GitHub 提供的。