15.3 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 提供的。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论