跳到主要内容

使用 RBAC 保护 API 资源

除了通过确保存在有效的 JWT 来保护资源的保护你的 API之外,还可以应用基于角色的访问控制 (RBAC)。

在本文中,我们将重点介绍 RBAC 如何影响认证 (Authentication) 流程中的权限 (Scope) 委派和验证。

授权 (Authorization) 流程图​

如图所示,与基本 API 保护的主要区别在于权限 (Scopes) 的处理。Logto 不再直接授予所有请求的权限,而是根据用户的 RBAC 策略过滤它们。JWT 令牌将仅包含用户通过其角色授予的权限。在 API 端,在验证令牌的真实性后,还有一个额外的检查,以确保令牌包含请求资源所需的权限。

可选:处理用户权限更改​

用户权限可能会在会话期间发生变化——例如,他们可能被分配新的角色或修改现有角色权限。在这些情况下,检测这些变化并更新应用程序 UI 可能是必要的。

当用户权限发生变化时会发生什么?有两种情况。

系统中没有引入新权限​

即使在用户权限更改后,当前的访问令牌仍将保持有效,直到它们过期。然而,新权限将在后续访问令牌中反映出来,任何被撤销的权限将被省略。

以下是一些推荐的操作:

选项 1:使用短期访问令牌过期时间

短期访问令牌可确保更频繁地更新用户权限。在控制台的 API 资源 设置中配置令牌过期设置。缺点是这将增加你的令牌使用量。

选项 2:动态检查权限

定期调用 Logto Management API 端点(例如,SWR)或使用 WebSocket 等技术实现长连接,以动态获取用户权限。在检测到更改时,清除现有的访问令牌,新签发的令牌将自动反映权限范围的更改。- API:用户角色 - API:角色权限

当检测到权限更改时,首先从存储中清除访问令牌,然后调用 SDK 方法 getAccessToken() 获取新的访问令牌。新签发的访问令牌应反映权限更改。

系统中引入新权限并分配给用户​

当你的系统中引入新权限时会发生这种情况。在这种情况下,你需要在初始化 Logto 客户端时首先包含新引入的权限范围。例如:

new LogtoClient({
appId: 'your-app-id',
redirectUrl: 'your-redirect-url',
resources: ['your-api-resource'],
scopes: [
// ... 你现有的权限范围,
'new-scope',
],
});

其次,你的每个客户端应用程序需要重新同意或重新登录用户,以接收新的权限更改。然后,新权限范围将在新的访问令牌中反映出来。

重新同意的代码示例:

signIn({ redirectUrl: 'your-redirect-url', prompt: 'consent' });

Logto x Cloudflare Workers: 如何保护你的 Workers 免受公共访问?

为机器对机器通信保护你的 API 资源