之前在《使用 IdentityServer 保护 Web 应用(AntD Pro 前端 + SpringBoot 后端) - Jeff Tian的文章 - 知乎 》里,使用 spring-security-oauth2 对接了授权服务(Duende IdentityServer),来保护 Java 服务。这时候,该 Java 服务是属于资源服务器。

image.png
后来又在《【已解决】spring-boot - 无效的 JWToken : kid is a required JOSE Header - Jeff Tian的文章 - 知乎 》里,以 Authing.cn 为授权服务的例子,详述了使用 spring-security-oauth2 时,资源服务器的配置。

今天,再次以这个 Authing.cn 的具体例子,详述一下从 spring-security-oauth2 升级到 spring-boot-starter-oauth2-resource-serve 的步骤。升级后能同样对资源服务进行保护,并且有更好的扩展性。

写个测试先

在做具体升级前,先添加一些自动化的集成测试。所采用的 Java 项目,运行时依赖 MySQL 数据库。为了方便测试,参考《借助 h2,加速 java 项目的自动化测试 - Jeff Tian的文章 - 知乎 》采用了 h2 内存数据库。
image.png

随后,添加了测试专属配置,仅在测试运行时启用 h2:
image.png
然后,使用 MockMvc 写了第一个用例:
image.png

为什么要升级到 spring-boot-starter-oauth2-resource-serve

以上的测试用例,其实没有展示受保护的接口。这个项目中,有些接口是被保护起来的,但是 /friends 接口是开放的。不过,这要求你在调用时不能传入 token。如果传入了错误的或者过期的 token,这个接口会返回 401,给人以需要认证的感觉。

我这次升级的动力是希望对于开放接口,即使前端传了 token,也不做校验。一个方案就是在检测到是开放接口时,自动移除 token。这在 **spring-boot-starter-oauth2-resource-serve **中比较容易做到。

删除旧依赖,引入新依赖

image.png

删除旧的 java 配置,换成新的

image.png

image.png

配置文件的更新

image.png

添加新测试

之前的版本,如果传入错误的 token,开放接口也会返回 401 。写个测试用例,期待返回 200 OK,这个测试会失败。
image.png

接下来,需要做些扩展,以让它通过。

添加一个针对开放接口移除 token 的 filter

image.png

将这个 filter 加入到 java 配置中

image.png

新的测试用例通过

image.png