2
2
title : RBAC
3
3
---
4
4
5
- 我们通过自定义依赖组件,实现了 RBAC 的轻松集成,在 Java 或其他语言中,常见的方式可能是注解,但在 FastAPI 中,依赖是它的亮点 ,也是核心
5
+ 我们通过自定义依赖组件,实现了 RBAC 的轻松集成,在 Java 或其他语言中,常见的方式可能是注解,但在 FastAPI 中,Depends 是它的亮点 ,也是核心
6
6
7
7
## RBAC
8
8
9
9
fba 内置了两种解决方案,分别为【角色菜单】、【Casbin】
10
10
11
- ### 角色菜单
12
-
13
11
::: tip
14
- fba 中默认未启用此鉴权方式
12
+ fba 中默认使用【Casbin】进行鉴权,管理员用户不受控,默认拥有所有访问权限
15
13
:::
16
14
15
+ ### 角色菜单
16
+
17
17
此方案是各类语言 web 开发中比较常见的解决方案,它可以设置按钮级别的控制规则
18
18
19
19
要想实现此 RBAC 鉴权,需要修改以下相关配置
@@ -24,25 +24,25 @@ fba 中默认未启用此鉴权方式
24
24
25
25
在 ` core/conf.py ` 文件中找到以下配置,并更新 ` RBAC_ROLE_MENU_MODE ` 为 ` True `
26
26
27
- ``` py
28
- # Permission (RBAC)
29
- RBAC_ROLE_MENU_MODE : bool = False
30
- ```
27
+ ``` py
28
+ # Permission (RBAC)
29
+ RBAC_ROLE_MENU_MODE : bool = False
30
+ ```
31
31
32
32
2 . 添加接口依赖
33
33
34
34
只有在接口中添加以下依赖时,才能自动调用此鉴权方式
35
35
36
- ```py{5 - 6 }
37
- @router.post (
38
- ' ' ,
39
- summary = ' xxx' ,
40
- dependencies = [
41
- Depends(RequestPermission(' sys:api:add' )), # 通常为 xxx:xxx:xxx
42
- DependsRBAC,
43
- ],
44
- )
45
- ```
36
+ ``` py{5-6}
37
+ @router.post(
38
+ '',
39
+ summary='xxx',
40
+ dependencies=[
41
+ Depends(RequestPermission('sys:api:add')), # 通常为 xxx:xxx:xxx
42
+ DependsRBAC,
43
+ ],
44
+ )
45
+ ```
46
46
47
47
3 . 在系统菜单中添加权限标识
48
48
@@ -53,10 +53,6 @@ fba 中默认未启用此鉴权方式
53
53
54
54
### Casbin
55
55
56
- ::: tip
57
- fba 中默认使用此鉴权方式
58
- :::
59
-
60
56
此方案是 Go 语言中比较流行的解决方案,它非常灵活,可以通过模型定义多种控制规则
61
57
62
58
要想使用此 RBAC 鉴权,需要学习以下几点
@@ -67,7 +63,7 @@ fba 中默认使用此鉴权方式
67
63
68
64
我们在最初架构设计时,参考了 go-admin,gin-vue-admin... 等优秀的开源项目,同时引入了 Casbin,它在众多 python web
69
65
开源项目中可能是极为罕见的,并且,它的学习成本非常高,如果你对此感兴趣,可以通过 [ 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 )
66
+ 进行学习,另外,可参考视频教程 [ 半小时彻底弄懂 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
67
,讲的是非常好
72
68
73
69
2 . 了解规则
@@ -77,37 +73,38 @@ fba 中默认使用此鉴权方式
77
73
78
74
内置模型 ` backend/plugin/casbin/utils/rbac.py ` :
79
75
80
- ```text:no- line- numbers
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
- ```
76
+ ``` text:no-line-numbers
77
+ [request_definition]
78
+ r = sub, obj, act
79
+
80
+ [policy_definition]
81
+ p = sub, obj, act
82
+
83
+ [role_definition]
84
+ g = _, _
85
+
86
+ [policy_effect]
87
+ e = some(where (p.eft == allow))
88
+
89
+ [matchers]
90
+ m = g(r.sub, p.sub) && (keyMatch(r.obj, p.obj) || keyMatch3(r.obj, p.obj)) && (r.act == p.act || p.act == "*")
91
+ ```
96
92
97
93
3 . 了解策略
98
94
::: tabs
99
95
@tab p 策略
100
- - 添加基于角色的访问权限(推荐)
101
96
102
- 需要配合添加 g 策略才能实现用户访问权限,适合配置所有用户接口访问策略,拥有此角色的用户便能拥有相应的访问权限< br>
97
+ - 添加基于角色的访问权限(推荐)
98
+
99
+ 需要配合添加 g 策略才能实现用户访问权限,适合配置所有用户接口访问策略,拥有此角色的用户便能拥有相应的访问权限<br >
103
100
104
- 格式:`角色 role + 访问路径 path + 访问方法 method`
101
+ 格式:` 角色 role + 访问路径 path + 访问方法 method `
105
102
106
- - 添加基于用户的访问权限(不推荐)
103
+ - 添加基于用户的访问权限(不推荐)
107
104
108
- 不需要配合添加 g 策略就能实现用户访问权限,适合配置指定用户接口访问策略< br>
105
+ 不需要配合添加 g 策略就能实现用户访问权限,适合配置指定用户接口访问策略<br >
109
106
110
- 格式:`用户 uuid + 访问路径 path + 访问方法 method`
107
+ 格式:` 用户 uuid + 访问路径 path + 访问方法 method `
111
108
112
109
@tab g 策略
113
110
当 p 策略为【添加基于角色的访问权限】时,需要此策略
@@ -122,11 +119,11 @@ fba 中默认使用此鉴权方式
122
119
123
120
只有在接口中添加以下依赖时,才能自动调用此鉴权方式
124
121
125
- ```python{1 }
126
- @router.post (' /hello' , summary = ' 你好' , dependencies = [DependsRBAC])
127
- async def hello ():
128
- ... .
129
- ```
122
+ ``` python{1}
123
+ @router.post('/hello', summary='你好', dependencies=[DependsRBAC])
124
+ async def hello():
125
+ ....
126
+ ```
130
127
131
128
:::
132
129
0 commit comments