rbac.md
... ...
@@ -0,0 +1,202 @@
1
+基于角色的访问控制 (RBAC) 是什么?
2
+
3
+基于角色的访问控制 (RBAC) 是一种访问控制模型,它将权限分配给角色而不是直接分配给用户,从而提供了一种灵活且高效的方式来管理系统中的访问权限。
4
+
5
+RBAC 的核心思想简单而强大:不是直接将权限分配给用户,而是将权限分配给角色,然后再将角色分配给用户。这种间接的权限分配方法极大地简化了管理访问权限的过程。
6
+
7
+RBAC 的关键概念是什么?
8
+RBAC 模型围绕四个主要元素:
9
+
10
+用户:系统中的个体,通常是真实的人。
11
+角色:组织中职位或职责的表示。
12
+权限:执行特定操作的授权。
13
+会话:用户激活某些角色的动态环境。
14
+RBAC 的基本工作流程可以总结如下:
15
+
16
+根据组织结构或业务需求定义角色。
17
+为每个角色分配适当的权限。
18
+根据用户的职责为其分配一个或多个角色。
19
+当用户尝试访问资源时,系统检查其分配的角色是否具有必要的权限。
20
+RBAC 在现实应用中如何使用?
21
+在典型的业务应用中使用 RBAC 时,你可以从回答以下三个基本问题开始:
22
+
23
+系统中需要保护哪些资源?
24
+需要对这些资源进行哪些操作控制?
25
+在现实场景中,哪些角色负责执行这些资源和操作?
26
+以电子商务系统为例。
27
+
28
+你可以首先识别需要保护的资源:
29
+
30
+产品
31
+订单
32
+然后,你可以确定需要对这些资源进行哪些操作控制,即定义这些资源的权限:
33
+
34
+产品
35
+read:product
36
+create:product
37
+delete:product
38
+订单
39
+read:order
40
+create:order
41
+delete:order
42
+有了上述权限后,你可以根据现实场景中的角色定义以下权限管理模型:
43
+
44
+产品管理员
45
+产品
46
+read:product
47
+create:product
48
+delete:product
49
+订单管理员
50
+订单
51
+read:order
52
+create:order
53
+delete:order
54
+最后,根据用户的职责为其分配角色:
55
+
56
+Alice: 产品管理员
57
+Bob: 订单管理员
58
+当用户访问资源时,系统将检查用户的分配角色是否具有必要的权限。
59
+
60
+例如,当 Alice 尝试读取产品信息时,系统首先检索她的角色信息,发现她具有产品管理员角色。
61
+
62
+然后,系统查询与该角色关联的权限,其中包括 read:product、create:product 和 delete:product。
63
+
64
+系统接着检查她的权限列表中是否存在所需的 read:product 权限。
65
+
66
+由于该权限存在,系统允许 Alice 访问产品列表。如果所需权限不在列表中,系统将拒绝访问请求。
67
+
68
+为什么不应该直接使用角色进行访问控制
69
+在 RBAC 实施中一个常见的错误是直接使用角色进行访问控制:
70
+
71
+// ❌ 有问题的方法
72
+if (user.hasRole('product_admin')) {
73
+ await deleteProduct(productId);
74
+}
75
+虽然这种方法看似简单,但随着系统的增长会产生问题。例如:
76
+
77
+当市场团队需要更新产品描述时,你需要修改代码以检查市场角色。
78
+当你希望某些产品经理只能发布而不能删除产品时,你需要为相关操作创建新的角色检查。
79
+当新的内容团队需要部分产品访问时,你又需要更新代码。
80
+相反,你应该始终检查特定的权限:
81
+
82
+// ✅ 推荐的方法
83
+if (user.hasPermission('delete:product')) {
84
+ await deleteProduct(productId);
85
+}
86
+这种基于权限的方法提供了几个优势:
87
+
88
+细粒度的权限控制:权限可以精确映射到特定的资源操作:
89
+创建产品:create:product
90
+更新产品:update:product
91
+删除产品:delete:product
92
+发布产品:publish:product
93
+灵活的角色配置:权限可以自由组合成角色而无需更改代码:
94
+const roles = {
95
+ product_admin: ['create:product', 'update:product', 'delete:product', 'publish:product'],
96
+ content_editor: ['update:product'],
97
+ publisher: ['publish:product'] // 可以轻松添加新角色
98
+};
99
+这种设计使你的系统能够适应业务增长:
100
+
101
+添加新角色只需进行权限配置
102
+调整角色权限通过配置完成
103
+新功能只需新的权限条目
104
+记住:角色应该只是权限的容器,而不是访问控制决策的基础。这种设计使 RBAC 能够提供最大价值。
105
+
106
+RBAC 模型及其演变
107
+RBAC0: 基础
108
+RBAC0 是定义用户、角色、权限和会话核心概念的基本模型。它是所有其他 RBAC 模型的基础。
109
+
110
+关键特性:
111
+
112
+用户-角色关联:多对多关系
113
+角色-权限关联:多对多关系
114
+
115
+此图展示了 RBAC0 的基本结构,显示了用户、角色和权限之间的关系。
116
+
117
+关键操作:
118
+
119
+为用户分配角色
120
+为角色分配权限
121
+检查用户是否具有特定权限
122
+虽然 RBAC0 提供了一个坚实的起点,但它有一些限制:
123
+
124
+角色爆炸:随着系统复杂性的增加,角色数量可能迅速增长。
125
+权限冗余:不同角色可能需要类似的权限集,导致重复。
126
+缺乏层次结构:无法表示角色之间的继承关系。
127
+RBAC1: 引入角色层次结构
128
+RBAC1 在 RBAC0 的基础上增加了角色继承的概念。
129
+
130
+RBAC1 = RBAC0 + 角色继承
131
+关键特性:
132
+
133
+角色层次结构:角色可以有父角色
134
+权限继承:子角色继承其父角色的所有权限
135
+
136
+此图展示了 RBAC1 中角色如何从其他角色继承。
137
+
138
+关键操作:
139
+
140
+
141
+此流程图展示了 RBAC1 中角色分配和权限检查的过程,包括角色继承方面。
142
+
143
+RBAC1 提供了几个优势:
144
+
145
+减少角色数量:通过继承可以创建更少的基础角色
146
+简化权限管理:更容易反映组织层次结构
147
+然而,RBAC1 仍然有一些限制:
148
+
149
+缺乏约束机制:无法限制用户同时持有潜在冲突的角色
150
+性能考虑:权限检查可能需要遍历整个角色层次结构
151
+RBAC2: 实施约束
152
+RBAC2 也基于 RBAC0,但引入了约束的概念。
153
+
154
+RBAC2 = RBAC0 + 约束
155
+关键特性:
156
+
157
+互斥角色:用户不能同时被分配到这些角色
158
+角色基数:限制可以分配给特定角色的用户数量
159
+前置角色:用户必须拥有特定角色才能被分配到另一个角色
160
+
161
+此流程图展示了 RBAC2 中角色分配和访问控制的过程,结合了各种约束。
162
+
163
+RBAC2 通过防止权限过度集中增强了安全性,并允许更精确的访问控制。然而,由于需要为每个角色分配检查多个约束条件,它增加了系统复杂性并可能影响性能。
164
+
165
+RBAC3: 综合模型
166
+RBAC3 结合了 RBAC1 和 RBAC2 的特性,提供了角色继承和约束机制:
167
+
168
+RBAC3 = RBAC0 + 角色继承 + 约束
169
+这个综合模型提供了最大的灵活性,但在实现和性能优化方面也带来了挑战。
170
+
171
+RBAC (基于角色的访问控制) 的优势是什么?
172
+简化的权限管理:通过角色进行批量授权,减少了管理单个用户权限的复杂性。
173
+增强的安全性:更精确的用户权限控制降低了安全风险。
174
+降低管理成本:修改角色权限会自动影响所有关联用户。
175
+与业务逻辑对齐:角色通常对应于组织结构或业务流程,使其更易于理解和管理。
176
+支持职责分离:通过互斥角色等约束可以分离关键职责。
177
+实际实施的考虑因素是什么?
178
+在现实场景中实施 RBAC 时,开发人员应考虑以下关键方面:
179
+
180
+数据库设计:利用关系数据库有效存储和查询 RBAC 结构。
181
+性能优化:实施缓存策略并优化权限检查,特别是对于复杂的 RBAC3 模型。
182
+API 和前端集成:设计清晰的 API 来管理用户、角色和权限,并考虑如何在前端应用中使用 RBAC。
183
+安全和审计:确保 RBAC 系统本身的安全性,并实施详细的日志记录和审计功能。
184
+可扩展性:设计时考虑未来的扩展,例如支持更复杂的权限规则或与其他系统集成。
185
+用户体验:为系统管理员设计直观的界面,以便轻松配置和维护 RBAC 结构。
186
+另请参阅
187
+ 基于属性的访问控制 (Attribute-based access control, ABAC)
188
+ 访问控制 (Access control)
189
+资源和参考
190
+RBAC and ABAC: The access control models you should know · Logto blog
191
+Role-based access control (RBAC) and attribute-based access control (ABAC) are two of the most popular access control models. In this post, we will give a brief overview of both models and discuss their differences.
192
+
193
+Mastering RBAC in Logto: A Comprehensive Real-World Example · Logto blog
194
+This article offers a comprehensive guide on mastering Role-Based Access Control (RBAC) in Logto, using a real-world example of an online bookstore to explore key user roles, scopes, and integrating Logto's RBAC features in frontend and backend applications for enhanced security and access control.
195
+
196
+Organization and Role-based access control: How to design your authorization model for your product · Logto blog
197
+This article provides a detailed guide on how to design an authorization model for organization and role-based access control, and offers best practices for different authorization models in the Logto platform.
198
+
199
+Role-based access control | Logto docs
200
+Role-based access control (RBAC) is a method of assigning permissions to users based on their roles. Consider using RBAC in the following scenarios:
201
+
202
+Role-based access control - Wikipedia