基于角色的访问控制 (RBAC)
基于角色的访问控制 (RBAC) 是一种根据用户的角色分配权限的方法。在以下场景中可以考虑使用 RBAC:
- 你有多个用户具有不同的访问需求:当用户需要基于角色的不同权限时,RBAC 是理想的选择,例如管理员、编辑者或查看者。
- 你需要简化权限管理:通过分配角色而不是单独设置权限来管理大量用户是高效的。
- 你的应用服务于不同的部门或团队:在不同的组需要对资源的不同访问级别的场景中非常有用。
理解基于角色的访问控制如何工作
权限 (Scopes)
权限 (Permission) 是指访问 API 资源 的授权 (Authorization)。在现实世界中,订单、产品和文档等实体可以被指定为资源,并可以分配各种操作。
权限的示例,包括编辑订单、读取文档和删除产品的能力,如下所示:
write:orders
read:documents
delete:products
上图显示了资源 https://api-1.store.io
中的权限 read:item
与资源 https://api-2.store.io
中的权限 read:item
是不同的。
如果没有提供 API 资源,权限将被视为“用于 OIDC”。通常这不是你在 RBAC 中想要的。
了解如何在 Logto 中配置 API 权限。
角色 (Roles)
角色 (Roles) 是可以分配给用户的权限 (Permissions) 的集合。它们还提供了一种聚合为不同 API 定义的权限的方法,使得添加、删除或调整权限比单独分配给用户更高效。
以下是一个 order_admin
角色的示例,它为两个资源提供了多个权限:
角色之间有权限重叠是可以的。
了解如何在 Logto 中配置角色。
示例:一个在线书店
假设你有一个在线书店需要管理。这里,我们为了演示目的大大简化了访问控制模型。
该模型分为两个主要的 API 资源:订单和产品。它们有不同的资源指示器如下:
- 订单:
https://api.store.io/orders
- 产品:
https://api.store.io/products
对于每个资源,你希望将权限分为读取、写入和删除。因此你总共定义了六个权限:
https://api.store.io/orders
- 权限
read:order
- 权限
write:order
- 权限
delete:order
- 权限
https://api.store.io/products
- 权限
read:product
- 权限
write:product
- 权限
delete:product
- 权限
以下是该模型的示意图:
你希望有两种类型的管理员,订单管理员和产品管理员:
- 订单管理员 可以管理订单并查看产品(因为订 单由产品组成),但不能管理产品。
- 产品管理员 可以管理产品,他们不应该知道任何订单。
因此你创建了两个角色,order_admin
和 product_admin
,具有以下权限:
order_admin
https://api.store.io/orders
read:order
,write:order
,delete:order
https://api.store.io/products
read:product
product_admin
https://api.store.io/products
read:product
,write:product
,delete:product
以下是这两个角色的示意图:
可以将 order_admin
和 product_admin
都分配给一个用户,那么他们将拥有你刚刚定义的所有六个权限。
注意订单管理员与产品管理员共享权限 read:product
,用户最终持有的权限是他们被分配的角色中所有权限的并集。
相关资源
掌握 Logto 中的 RBAC:一个全面的真实世界示例CIAM 102: 授权 (Authorization) 与基于角色的访问控制 (RBAC)