2
2
title : RBAC
3
3
---
4
4
5
- 我们通过两个自定义依赖组件 ,实现了 RBAC 的轻松集成,在 Java 或其他语言中,常见的方式可能是注解,但在 FastAPI 中,依赖是它的亮点,也是核心
5
+ 我们通过自定义依赖组件 ,实现了 RBAC 的轻松集成,在 Java 或其他语言中,常见的方式可能是注解,但在 FastAPI 中,依赖是它的亮点,也是核心
6
6
7
7
## RBAC
8
8
9
- RBAC 内置了两种解决方案,分别为【角色菜单】、【Casbin】
9
+ fba 内置了两种解决方案,分别为【角色菜单】、【Casbin】
10
10
11
- 【角色菜单】是各类语言 web 开发中比较常见的解决方案,它可以设置按钮级别的控制规则
11
+ ### 角色菜单
12
12
13
- 【Casbin】是 Go 语言中比较流行的解决方案,它非常灵活,可以通过模型定义多种控制规则
13
+ ::: tip
14
+ fba 中默认未启用此鉴权方式
15
+ :::
14
16
15
- ### 角色菜单
17
+ 此方案是各类语言 web 开发中比较常见的解决方案,它可以设置按钮级别的控制规则
16
18
17
- 要想实现此 RBAC 调用,涉及到三处相关配置
19
+ 要想实现此 RBAC 鉴权,需要修改以下相关配置
18
20
19
21
::: steps
20
22
@@ -29,7 +31,7 @@ RBAC 内置了两种解决方案,分别为【角色菜单】、【Casbin】
29
31
30
32
2 . 添加接口依赖
31
33
32
- 只有在接口中填加以下相关依赖时,才能自动应用此鉴权方式
34
+ 只有在接口中添加以下依赖时,才能自动调用此鉴权方式
33
35
34
36
```py{5 - 6 }
35
37
@router.post (
@@ -51,50 +53,82 @@ RBAC 内置了两种解决方案,分别为【角色菜单】、【Casbin】
51
53
52
54
# ## Casbin
53
55
54
- 我们在最初架构设计时,参考了 go- admin,gin- vue- admin... 等优秀的开源项目,同时引入了
55
- Casbin,它在众多 python web 开源项目中可能是极为罕见的,并且,它的学习成本非常高,如果你对此感兴趣,可以通过
56
- [Casbin 官网](https:// casbin.org/ docs/ get- started) 进行学习,另外,可参考视频教程
57
- [半小时彻底弄懂Casbin基础模型](https:// www.bilibili.com/ video/ BV1qz4y167XP/ ? spm_id_from = 333.999 .0.0& vd_source = 958c4d7f9243c68a0ec9dcd327bad930 )、
58
- [Casbin的代码使用、api调用、自定义比较方法](https:// www.bilibili.com/ video/ BV13r4y1M7AC/ ? spm_id_from = 333.999 .0.0& vd_source = 958c4d7f9243c68a0ec9dcd327bad930 )
59
- ,讲的是非常好
56
+ ::: tip
57
+ fba 中默认使用此鉴权方式
58
+ :::
59
+
60
+ 此方案是 Go 语言中比较流行的解决方案,它非常灵活,可以通过模型定义多种控制规则
61
+
62
+ 要想使用此 RBAC 鉴权,需要学习以下几点
63
+
64
+ ::: steps
65
+
66
+ 1 . 了解 Casbin
67
+
68
+ 我们在最初架构设计时,参考了 go- admin,gin- vue- admin... 等优秀的开源项目,同时引入了 Casbin,它在众多 python web
69
+ 开源项目中可能是极为罕见的,并且,它的学习成本非常高,如果你对此感兴趣,可以通过 [Casbin 官网](https:// casbin.org/ docs/ get- started)
70
+ 进行学习,另外,可参考视频教程 [半小时彻底弄懂Casbin基础模型](https:// www.bilibili.com/ video/ BV1qz4y167XP/ ? spm_id_from = 333.999 .0.0& vd_source = 958c4d7f9243c68a0ec9dcd327bad930 )、[Casbin的代码使用、api调用、自定义比较方法](https:// www.bilibili.com/ video/ BV13r4y1M7AC/ ? spm_id_from = 333.999 .0.0& vd_source = 958c4d7f9243c68a0ec9dcd327bad930 )
71
+ ,讲的是非常好
72
+
73
+ 2 . 了解规则
74
+
75
+ 通过以上学习之后,我们再来看内置规则(不学习 == 天书),你可以通过[编辑器](https:// casbin.org/ zh/ docs/ online- editor)
76
+ 进行模型规则验证
77
+
78
+ 内置模型 `backend/ plugin/ casbin/ utils/ rbac.py` :
79
+
80
+ ```model
81
+ [request_definition]
82
+ r = sub, obj, act
83
+
84
+ [policy_definition]
85
+ p = sub, obj, act
86
+
87
+ [role_definition]
88
+ g = _, _
89
+
90
+ [policy_effect]
91
+ e = some(where (p.eft == allow))
92
+
93
+ [matchers]
94
+ m = g(r.sub, p.sub) && (keyMatch(r.obj, p.obj) || keyMatch3(r.obj, p.obj)) && (r.act == p.act || p.act == " *" )
95
+ ```
96
+
97
+ 3 . 了解策略
60
98
61
- 通过以上学习之后,我们再来看内置规则(不学习 == 天书),
62
- 你可以通过[编辑器](https: // casbin.org / zh / docs / online - editor)进行模型规则验证
99
+ p 策略:
100
+ - 添加基于角色的访问权限(推荐)
63
101
64
- 模型:
102
+ 需要配合添加 g 策略才能实现用户访问权限,适合配置所有用户接口访问策略,拥有此角色的用户便能拥有相应的访问权限 < br >
65
103
66
- ```
67
- [ request_definition]
68
- r = sub, obj, act
104
+ 格式:`角色 role + 访问路径 path + 访问方法 method`
69
105
70
- [ policy_definition]
71
- p = sub, obj, act
106
+ - 添加基于用户的访问权限(不推荐)
72
107
73
- [ role_definition]
74
- g = _ , _
108
+ 不需要配合添加 g 策略就能实现用户访问权限,适合配置指定用户接口访问策略< br>
75
109
76
- [ policy_effect]
77
- e = some(where (p.eft == allow))
110
+ 格式:`用户 uuid + 访问路径 path + 访问方法 method`
78
111
79
- [ matchers]
80
- m = g(r.sub, p.sub) && (keyMatch(r.obj, p.obj) || keyMatch3(r.obj, p.obj)) && (r.act == p.act || p.act == "* ")
81
- ```
112
+ g 策略(基于 p 策略):
113
+ - 添加基于角色的访问权限
82
114
83
- p 策略:
115
+ 格式: `用户 uuid + 角色 role`
84
116
85
- - 推荐添加基于角色的访问权限, 需配合添加 g 策略才能真正拥有访问权限,适合配置全局接口访问策略<br>
86
- **格式**: 角色 role + 访问路径 path + 访问方法 method
117
+ 4 . 添加策略
87
118
88
- - 如果添加基于用户的访问权限, 不需配合添加 g 策略就能真正拥有权限,适合配置指定用户接口访问策略<br>
89
- **格式**: 用户 uuid + 访问路径 path + 访问方法 method
119
+ 在文件 `backend/ plugin/ casbin/ api/ v1/ sys/ casbin.py` 中,包含策略相关接口,依据模型和策略规则添加相关策略即可
90
120
91
- g 策略 (**依赖 p 策略**):
121
+ 5 . 检查接口依赖
92
122
93
- - 如果在 p 策略中添加了基于角色的访问权限, 则还需要在 g 策略中添加基于用户组的访问权限, 才能真正拥有访问权限<br>
94
- **格式**: 用户 uuid + 角色 role
123
+ 只有在接口中添加以下依赖时,才能自动调用此鉴权方式
95
124
96
- - 如果在 p 策略中添加了基于用户的访问权限, 则不添加相应的 g 策略能直接拥有访问权限,但是拥有的不是用户角色的所有权限,
97
- 而只是单一的对应的 p 策略所添加的访问权限
125
+ ```python{1 }
126
+ @router.post (' /hello' , summary = ' 你好' , dependencies = [DependsRBAC])
127
+ async def hello ():
128
+ ... .
129
+ ```
130
+
131
+ :::
98
132
99
133
# # 解耦
100
134
0 commit comments