Spring Boot + Auth0 实现 API 安全与授权:OAuth2 与 RBAC 完整指南
文章目录
了解如何使用 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/