
银行如何利用对话式 AI 实现客户服务转型
了解如何使用 Spring Boot、Java 和 Auth0 为 API 添加授权功能,确保其安全性和功能完整性。本文将通过实践示例,讲解如何在 Spring Boot API 中实现 OAuth2 授权和基于角色的访问控制(RBAC)。
OAuth 2.0 是一种授权框架,通过访问令牌来授权访问受保护资源。访问令牌通常包含访问范围(scope)和有效期,资源服务器验证令牌后决定是否允许访问。
OAuth 2.0 定义了以下角色及流程:
客户端通过授权服务器请求资源访问,并获得访问令牌。
OpenID Connect 建立在 OAuth2 之上,通过返回 JWT 格式的 ID 令牌,提供身份验证信息。客户端向 OpenID 提供者发送请求,验证用户身份后,返回 ID 令牌和访问令牌。
假设您已有一个 Spring Boot 菜单 API,需要确保只有授权用户才能访问端点。
git clone https://github.com/oktadev/spring-menu-api.git
存储库包含两个项目文件夹:“start”和“demo”。
使用 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'
}
在 application.properties
中添加:
okta.oauth2.issuer=https://YOUR_OKTA_DOMAIN/oauth2/default
okta.oauth2.audience=https://menu-api.okta.com
运行 API 并测试未授权访问:
curl -i localhost:8080/api/menu/items
如果未提供访问令牌,将返回 HTTP 401。
使用 Auth0 CLI 获取访问令牌:
auth0 test token -a https://menu-api.okta.com -s openid
带令牌访问 API:
ACCESS_TOKEN=<your_token>
curl -i --header "Authorization: Bearer $ACCESS_TOKEN" localhost:8080/api/menu/items
注册 SPA 客户端(WHATABYTE):
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
在 Spring Boot 控制器中允许跨域请求:
@CrossOrigin(origins = "https://dashboard.whatabyte.app")
@RestController
@RequestMapping("/api/menu/items")
public class ItemController {
// 控制器代码
}
RBAC 通过角色分配权限,实现细粒度的授权。
在 WHATABYTE 客户端启用 RBAC,创建角色“菜单管理员”,并将角色分配给用户:
auth0 users roles assign
使用 Auth0 动作(Actions)将角色映射到访问令牌:
exports.onExecutePostLogin = async (event, api) => {
const namespace = 'https://menu-api.okta.com';
if (event.authorization) {
api.accessToken.setCustomClaim(${namespace}/roles
, event.authorization.roles);
}
};
为 API 启用 RBAC 并分配权限:
auth0 api patch "resource-servers/" \
--data '{ "enforce_policies": true, "token_dialect": "access_token_authz" }'
auth0 roles permissions add
在 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 添加安全性和授权功能,包括:
通过这些步骤,开发者可保障 API 安全、优化访问管理,并提升应用的可扩展性和安全性。