Spring Boot + Auth0 实现 API 安全与授权:OAuth2 与 RBAC 完整指南

作者:API传播员 · 2025-09-26 · 阅读时间:6分钟

了解如何使用 Spring Boot、Java 和 Auth0,通过在 Spring Boot 中实现授权功能,确保 API 的安全性和功能完整性。


Web 上的身份验证和授权

身份验证是验证用户身份的过程,用于确认用户是否是其声称的身份。而授权则是赋予用户访问特定资源权限的过程。

OAuth 2.0 是一种授权框架,通过访问令牌来授权对受保护资源的访问。访问令牌是授权的数字表示,通常包含访问范围和有效期等信息。资源服务器会验证这些令牌,从而决定是否允许访问。OAuth 2.0 定义了资源所有者、资源服务器、客户端和授权服务器的角色,以及客户端如何通过授权服务器请求资源访问的协议流程。

OpenID Connect 是建立在 OAuth 2.0 之上的身份验证协议,它通过返回 JWT 格式的 ID 令牌,提供关于身份验证的信息。该协议定义了客户端(或依赖方)角色,客户端向 OpenID 提供者发送请求,后者验证最终用户身份并获得授权,然后返回 ID 令牌和访问令牌。


在 Spring Boot API 中实现授权

假设您已经构建了一个 Spring Boot 菜单 API,需要确保其安全性,使得只有授权用户才能访问其端点。以下是实现 OAuth 2.0 和 Auth0 授权的步骤:

克隆 API 存储库

首先,获取 API 的基础代码:

git clone https://github.com/oktadev/spring-menu-api.git

存储库包含两个项目文件夹:“start”和“demo”。“start”文件夹中是未配置安全性的基础项目,您可以使用自己喜欢的 IDE 打开它。如果希望直接运行完整的安全配置,可以参考“demo”文件夹中的内容。

注册 API 并配置作用域

使用 Auth0 CLI 注册 API,并定义所需的作用域:

auth0 apis create 
  --name "Menu API" 
  --identifier https://menu-api.okta.com 
  --scopes "create:items,update:items,delete:items" 
  --offline-access=false

添加依赖项

build.gradle 文件中添加以下依赖项:

dependencies {
  implementation 'com.okta.spring:okta-spring-boot-starter:3.0.6'
}

配置 OAuth2 资源服务器

application.properties 文件中添加以下配置:

okta.oauth2.issuer=https:///
okta.oauth2.audience=https://menu-api.okta.com

测试 API 授权

运行 API 后,使用以下命令测试授权:

curl -i localhost:8080/api/menu/items

如果未提供访问令牌,您将收到 HTTP 401 响应。接下来,使用 Auth0 CLI 获取访问令牌:

auth0 test token -a https:///api/v2/ -s openid

然后使用以下命令携带令牌访问 API:

ACCESS_TOKEN=
curl -i --header "Authorization: Bearer $ACCESS_TOKEN" localhost:8080/api/menu/items

如果令牌的受众(aud)声明与服务器配置不匹配,您可能会收到错误消息。使用以下命令请求正确的令牌:

auth0 test token -a https://menu-api.okta.com -s openid

从单页应用程序(SPA)测试身份验证

您可以使用 WHATABYTE 客户端测试 API。首先,将客户端注册为 Auth0 的单页应用程序(SPA):

auth0 apps create 
  --name "WHATABYTE client" 
  --description "Single-Page Application for menu items CRUD" 
  --type spa 
  --callbacks https://dashboard.whatabyte.app/home 
  --logout-urls https://dashboard.whatabyte.app/home 
  --origins https://dashboard.whatabyte.app 
  --web-origins https://dashboard.whatabyte.app

配置客户端的 API 基础 URL 为 http://localhost:8080,并启用身份验证功能。

配置 CORS

在 API 项目中,添加以下配置以允许 WHATABYTE 客户端的请求来源:

@CrossOrigin(origins = "https://dashboard.whatabyte.app")
@RestController
@RequestMapping("/api/menu/items")
public class ItemController {
  // 控制器代码
}

基于角色的访问控制(RBAC)

RBAC 是一种标准的授权方法,通过角色分配权限。以下是实现步骤:

创建和分配角色

在 WHATABYTE 客户端中启用 RBAC,并设置角色名称为“菜单管理员”。然后,在 Auth0 中定义该角色,并将其分配给用户:

auth0 users roles assign

将角色映射到令牌声明

使用 Auth0 动作将角色映射到访问令牌中的声明:

exports.onExecutePostLogin = async (event, api) => {
  const namespace = 'https://menu-api.okta.com';
  if (event.authorization) {
    api.accessToken.setCustomClaim(${namespace}/roles, event.authorization.roles);
  }
};

启用 RBAC

为 API 启用 RBAC,并将权限分配给角色:

auth0 api patch "resource-servers/" 
  --data '{ "enforce_policies": true, "token_dialect": "access_token_authz" }'

auth0 roles permissions add

在 Spring Boot API 中实现 RBAC

application.properties 文件中添加以下配置:

okta.oauth2.groupsClaim=permissions

使用 @PreAuthorize 注解定义端点权限:

@PreAuthorize("hasAuthority('create:items')")
@PostMapping
public ResponseEntity createItem(@Valid @RequestBody Item item) {
  // 创建逻辑
}

确保在安全配置中启用全局方法安全性:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
  @Bean
  public SecurityFilterChain configure(HttpSecurity http) throws Exception {
    return http.oauth2ResourceServer(oauth2ResourceServer -> oauth2ResourceServer.jwt()).build();
  }
}

重新启动 API,用户现在可以根据角色权限执行相应的操作。


总结

通过本教程,您学习了如何使用 OAuth2 和 Auth0 为 Spring Boot API 添加安全性和授权功能,包括如何配置资源服务器和实现基于角色的访问控制(RBAC)。希望这些内容对您有所帮助!

原文链接: https://auth0.com/blog/spring-boot-authorization/