创建安全的Spring REST API - Okta开发者指南

作者:API传播员 · 2026-01-11 · 阅读时间:6分钟

“如果它有用,它就会被修改。” 这句智慧的话来自我的一位QA老师,他解释说,所有软件在对某人有用时都会不断进化。用户每天都会向我们提出新功能的需求、错误修复以及域逻辑的更改。随着项目(尤其是单体架构项目)的发展,维护难度会逐渐增加,新项目的开发门槛也会随之提高。

在本教程中,我们将探讨如何构建一个安全的 Spring REST API,并通过微服务架构解决部分开发和维护的痛点。


微服务架构的优势与挑战

微服务架构可以将应用程序逻辑划分为多个更易于维护和扩展的模块。它支持使用不同的技术栈,并允许团队并行开发。然而,微服务并非解决所有扩展和维护问题的万能方案,它也带来了以下架构挑战:

  • 服务之间如何通信?
  • 如何处理通信故障和服务可用性?
  • 如何在服务之间跟踪用户请求?
  • 如何管理用户访问单个服务的授权?

接下来,我们将深入探讨如何在构建 Spring REST API 时应对这些挑战。


使用 OAuth 2.0 保护您的 Spring REST API

OAuth 2.0 中,资源服务器是一种专注于处理域逻辑请求的服务。它不包含登录工作流或复杂的身份验证机制,而是通过接收预先获取的访问令牌来验证用户权限,并返回相应的响应。

在本教程中,我们将使用 Spring Boot 和 Okta 构建一个简单的资源服务器,并实现接收和验证 JWT(JSON Web Token)令牌的功能。


添加资源服务器到您的 Spring REST API

为了快速开始,请克隆以下资源库,并切换到“启动”标记。项目结构如下:

  • 文件 HelloWorldController 是一个简单的 @RestController,用于返回“Hello World”消息。

在终端中运行以下命令以启动 Spring Boot:

./mvnw spring-boot:run

提示: 如果上述命令无法运行,请尝试使用 mvn spring-boot:run

加载完成后,您将拥有一个简单的 REST API 添加保护机制。


设置 OAuth 2.0 资源服务器

  1. 在 Okta 仪表板中创建服务应用程序

    • 创建一个 Service 类型的应用程序,该应用程序没有登录页面或获取新令牌的功能。
    • 单击 下一步,输入服务名称并完成设置。
    • 复制并保存生成的 客户端 ID客户端密码,稍后会用到。

  2. 添加依赖项

    编辑 pom.xml 文件,添加 Spring Security 和 Okta 的依赖项以启用 OAuth 2.0 功能。

  3. 运行项目并测试

    再次运行 Spring Boot,并尝试访问 Hello World 资源。


将 Spring Security 添加到您的 REST API

Spring Boot 提供了自动配置功能,可以根据类路径中的依赖项自动保护资源。为了正确验证请求,您需要配置 Spring Security。

  1. 修改 application.properties 文件,添加 Okta 仪表板中生成的 client_idclient_secret
  2. 创建一个新的配置类 SecurityConfig,并添加以下注解:
    • @EnableWebSecurity:启用 Spring Security 的 Web 安全机制。
    • @EnableResourceServer:启用通过 OAuth 2.0 令牌进行请求验证的功能。

配置完成后,您的 API 已经具备基本的安全性。再次运行 Spring Boot 并使用 cURL 测试 API


在 Spring REST API 中生成访问令牌

为了测试 API,您需要生成访问令牌:

  1. 创建新的 Web 应用程序

    • 在 Okta 仪表板中创建一个新的 Web 应用程序。
    • 设置 登录重定向 URIhttps://oidcdebugger.com/debug,并选择“混合”作为授权类型。
    • 完成设置后,复制生成的客户端 ID。

  2. 生成令牌

    使用 OpenID Connect 调试工具生成令牌,并通过 cURL 命令将令牌添加到请求中。


添加 OAuth 2.0 范围

OAuth 2.0 范围允许用户对应用程序的权限进行细粒度控制。例如,您可以定义“读取”和“写入”范围,并根据需要请求特定的权限。

  1. 启用方法级别的安全性

    SecurityConfig 类中添加 @EnableGlobalMethodSecurity(prePostEnabled = true) 注解。

  2. 保护端点

    修改 HelloWorldController,为某些端点添加 @PreAuthorize 注解。例如:

    @PreAuthorize("#oauth2.hasScope('profile')")

    该注解会在方法执行前验证请求是否具有指定范围的授权。

使用新生成的令牌测试受保护的端点,确保只有具有正确范围的请求可以访问。


总结

在本教程中,您学习了如何使用 Spring Boot 创建一个安全的资源服务器,并将其与 OAuth 2.0 集成。通过 Okta 提供的工具,您可以轻松实现令牌验证、范围控制等功能。

Spring 和 REST API 是非常重要的开发主题,值得深入研究。您可以访问 GitHub 获取本教程的完整源代码。


原文链接: https://developer.okta.com/blog/2018/12/18/secure-spring-rest-api