22title : RBAC
33---
44
5- 我们通过自定义依赖组件,实现了 RBAC 的轻松集成,在 Java 或其他语言中,常见的方式可能是注解,但在 FastAPI 中,Depends
6- 是它的亮点,也是核心
5+ 我们通过自定义依赖组件,实现了 RBAC 的轻松集成,它可以通过 FastAPI Depends 轻松集成
76
8- ## RBAC
9-
10- fba 内置了两种解决方案,分别为【角色菜单】、【Casbin】
11-
12- ::: tip
13- fba 中默认使用【Casbin】进行鉴权,管理员用户不受控,默认拥有所有访问权限
7+ ::: warning
8+ 自 fba ` v1.1.2 ` 版本起,开始使用【角色菜单】作为默认 RBAC 鉴权,Casbin 将作为外置插件进行分发
149:::
1510
16- ### 角色菜单
17-
18- 此方案是各类语言 web 开发中比较常见的解决方案,它可以设置按钮级别的控制规则
11+ ## 角色菜单
1912
20- 要想实现此 RBAC 鉴权,需要修改以下相关配置
13+ 要想实现此 RBAC 鉴权,需要进行以下配置
2114
2215::: steps
2316
24- 1 . 更新 RBAC 鉴权配置
25-
26- 在 ` core/conf.py ` 文件中找到以下配置,并更新 ` RBAC_ROLE_MENU_MODE ` 为 ` True `
27-
28- ``` py
29- # Permission (RBAC)
30- RBAC_ROLE_MENU_MODE : bool = False
31- ```
32-
33- 2 . 添加接口依赖
17+ 1 . 添加接口依赖
3418
3519 只有在接口中添加以下依赖时,才能自动调用此鉴权方式
3620
@@ -45,100 +29,22 @@ fba 中默认使用【Casbin】进行鉴权,管理员用户不受控,默认
4529 )
4630 ```
4731
48- 3 . 在系统菜单中添加权限标识
32+ 2 . 在系统菜单中添加权限标识
4933
50- 我们在接口依赖中可以看到 ` sys:api:add ` 之类的值,这些值正是对应着菜单中的权限标识,
51- 只有它们完全一致,并且用户拥有对应的菜单时,才会获得相应的操作权限
34+ 我们在接口依赖中可以看到 ` sys:api:add ` 之类的值,这些值正是对应着菜单中的权限标识,只有它们完全一致,并且用户拥有对应的菜单时,才可以获得相应的操作权限
5235
5336:::
5437
55- ### Casbin
56-
57- 此方案是 Go 语言中比较流行的解决方案,它非常灵活,可以通过模型定义多种控制规则
58-
59- 要想使用此 RBAC 鉴权,需要学习以下几点
60-
61- ::: steps
62-
63- 1 . 了解 Casbin
64-
65- 我们在最初架构设计时,参考了 go-admin,gin-vue-admin... 等优秀的开源项目,同时引入了 Casbin,它在众多 python web
66- 开源项目中可能是极为罕见的,并且,它的学习成本非常高,如果你对此感兴趣,可以通过 [ Casbin 官网] ( https://casbin.org/docs/get-started )
67- 进行学习,另外,可参考视频教程 [ 半小时彻底弄懂 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 )
68- ,讲的是非常好
69-
70- 2 . 了解规则
71-
72- 通过以上学习之后,我们再来看内置规则(不学习 == 天书),你可以通过[ 编辑器] ( https://casbin.org/zh/docs/online-editor )
73- 进行模型规则验证
74-
75- 内置模型 ` backend/plugin/casbin/utils/rbac.py ` :
76-
77- ``` text:no-line-numbers
78- [request_definition]
79- r = sub, obj, act
80-
81- [policy_definition]
82- p = sub, obj, act
83-
84- [role_definition]
85- g = _, _
86-
87- [policy_effect]
88- e = some(where (p.eft == allow))
89-
90- [matchers]
91- m = g(r.sub, p.sub) && (keyMatch(r.obj, p.obj) || keyMatch3(r.obj, p.obj)) && (r.act == p.act || p.act == "*")
92- ```
93-
94- 3 . 了解策略
95- ::: tabs
96- @tab p 策略
97-
98- - 添加基于角色的访问权限(推荐)
99-
100- 需要配合添加 g 策略才能实现用户访问权限,适合配置所有用户接口访问策略,拥有此角色的用户便能拥有相应的访问权限<br >
101-
102- 格式:` 角色 role + 访问路径 path + 访问方法 method `
103-
104- - 添加基于用户的访问权限(不推荐)
105-
106- 不需要配合添加 g 策略就能实现用户访问权限,适合配置指定用户接口访问策略<br >
107-
108- 格式:` 用户 uuid + 访问路径 path + 访问方法 method `
109-
110- @tab g 策略
111- 当 p 策略为【添加基于角色的访问权限】时,需要此策略
112-
113- 格式:` 用户 uuid + 角色 role `
114-
115- 4 . 添加策略
38+ ## Casbin
11639
117- 在文件 ` backend/plugin/casbin/api/v1/sys/casbin.py ` 中,包含策略相关接口,依据模型和策略规则添加相关策略即可
118-
119- 5 . 检查接口依赖
120-
121- 只有在接口中添加以下依赖时,才能自动调用此鉴权方式
122-
123- ``` python{1}
124- @router.post('/hello', summary='你好', dependencies=[DependsRBAC])
125- async def hello():
126- ....
127- ```
128-
129- :::
40+ 此方案是 Go 语言中比较流行的解决方案,它非常灵活,可以通过模型定义多种控制规则,要想实现此 RBAC
41+ 鉴权,请通过 [ 插件市场] ( ../../plugin/market.md ) 获取
13042
13143## 解耦
13244
133- 在实际项目开发中,不可能同时存在两种 RBAC 解决方案,我们可以通过以下方式删除其中一种集成
134-
135- ### 角色菜单
45+ 在实际项目开发中,不可能同时存在多种 RBAC 解决方案,您可以通过以下方式删除【角色菜单】集成
13646
13747- 删除 ` backend/common/security/permission.py ` 文件中的 ` RequestPermission ` 类及所有类调用
13848- 删除 ` backend/core/conf.py ` 文件中的 ` RBAC_ROLE_MENU_MODE ` 和 ` RBAC_ROLE_MENU_EXCLUDE `
13949- 删除 ` backend/common/security/rbac.py ` 文件中 ` rbac_verify ` 方法里面的 ` if settings.RBAC_ROLE_MENU_MODE: `
14050 条件及相关代码
141-
142- ### Casbin
143-
144- 删除 ` backend/plugin/casbin ` 文件夹
0 commit comments