22title : RBAC
33---
44
5- 我们通过两个自定义依赖组件,实现了 RBAC 的轻松集成,在 Java 或其他语言中,常见的方式可能是注解,但在 fastapi 中,依赖是它的亮点,也是核心
5+ 我们通过两个自定义依赖组件,实现了 RBAC 的轻松集成,在 Java 或其他语言中,常见的方式可能是注解,但在 FastAPI 中,依赖是它的亮点,也是核心
66
77## RBAC
88
9- RBAC 提供了两种解决方案,第一种【角色菜单】可能更加常见,它可以设置按钮级别的控制规则,另外一种是【Casbin】,它非常灵活,可以通过模型定义多种
10- 控制规则(我认为它很好,性能也很出色)
9+ RBAC 提供了两种解决方案,分别为【角色菜单】、【Casbin】
10+
11+ 【角色菜单】是各类语言 web 开发中比较常见的解决方案,它可以设置按钮级别的控制规则
12+
13+ 【Casbin】是 Go 语言中比较流行的解决方案,它非常灵活,可以通过模型定义多种控制规则
1114
1215### 角色菜单
1316
@@ -26,35 +29,37 @@ RBAC 提供了两种解决方案,第一种【角色菜单】可能更加常见
2629
27302 . 添加接口依赖
2831
29- 只有在接口中填加此依赖时 ,才能自动应用此鉴权方式
32+ 只有在接口中填加以下相关依赖时 ,才能自动应用此鉴权方式
3033
3134 ```py{5 - 6 }
3235 @router.post (
3336 ' ' ,
3437 summary = ' xxx' ,
3538 dependencies = [
36- Depends(RequestPermission(' sys:api:add' )),
39+ Depends(RequestPermission(' sys:api:add' )), # 通常为 xxx:xxx:xxx
3740 DependsRBAC,
3841 ],
3942 )
4043 ```
4144
42453 . 在菜单中添加权限标识
4346
44- 我们在接口依赖中可以看到 `sys:api:add` 之类的值,这些值正是对应着菜单中的权限标识,只有它们完全一致,并且用户拥有菜单时,才会获得相应的操作权限
45- :::
47+ 我们在接口依赖中可以看到 `sys:api:add` 之类的值,这些值正是对应着菜单中的权限标识,
48+ 只有它们完全一致,并且用户拥有对应的菜单时,才会获得相应的操作权限
49+
50+ :::
4651
4752# ## Casbin
4853
49- Casbin 在 Go web 中应用更加广泛, 我们在最初架构设计时,参考了 go- admin,gin- vue- admin... 等优秀的开源项目,同时引入了
50- Casbin,它在众多 python web 开源项目中可能是极为罕见的,并且,它的学习成本相对较高 ,如果你对此感兴趣,可以通过
51- [Casbin 官网](https:// casbin.org/ docs/ get- started) 进行学习,另外,可参考视频教程 (
54+ 我们在最初架构设计时,参考了 go- admin,gin- vue- admin... 等优秀的开源项目,同时引入了
55+ Casbin,它在众多 python web 开源项目中可能是极为罕见的,并且,它的学习成本非常高 ,如果你对此感兴趣,可以通过
56+ [Casbin 官网](https:// casbin.org/ docs/ get- started) 进行学习,另外,可参考视频教程
5257[半小时彻底弄懂Casbin基础模型](https:// www.bilibili.com/ video/ BV1qz4y167XP/ ? spm_id_from = 333.999 .0.0& vd_source = 958c4d7f9243c68a0ec9dcd327bad930 )、
5358[Casbin的代码使用、api调用、自定义比较方法](https:// www.bilibili.com/ video/ BV13r4y1M7AC/ ? spm_id_from = 333.999 .0.0& vd_source = 958c4d7f9243c68a0ec9dcd327bad930 )
54- )
59+ ,讲的是非常好
5560
56- 通过以上学习之后,我们再来看规则(不学习规则可能是天书 ),
57- 你可以通过此 [编辑器](https:// github.com / casbin / casbin - editor)进行规则验证
61+ 通过以上学习之后,我们再来看内置规则(不学习 == 天书 ),
62+ 你可以通过 [编辑器](https:// casbin.org / zh / docs / online - editor)进行模型规则验证
5863
5964模型:
6065
@@ -88,5 +93,27 @@ g 策略 (**依赖 p 策略**):
8893- 如果在 p 策略中添加了基于角色的访问权限, 则还需要在 g 策略中添加基于用户组的访问权限, 才能真正拥有访问权限<br>
8994 **格式**: 用户 uuid + 角色 role
9095
91- - 如果在 p 策略中添加了基于用户的访问权限, 则不添加相应的 g 策略能直接拥有访问权限<br>
92- 但是拥有的不是用户角色的所有权限, 而只是单一的对应的 p 策略所添加的访问权限
96+ - 如果在 p 策略中添加了基于用户的访问权限, 则不添加相应的 g 策略能直接拥有访问权限,但是拥有的不是用户角色的所有权限,
97+ 而只是单一的对应的 p 策略所添加的访问权限
98+
99+ ## 解耦
100+
101+ 在实际项目开发中,不可能同时存在两种 RBAC 解决方案,我们可以通过以下方式删除其中一种集成
102+
103+ ### 角色菜单
104+
105+ - 删除 `backend/common/security/permission.py` 文件中的 `RequestPermission` 类及所有类调用
106+ - 删除 `backend/core/conf.py` 文件中的 `PERMISSION_MODE` 和 `RBAC_ROLE_MENU_EXCLUDE`
107+ - 删除 `backend/common/security/rbac.py` 文件中 `rbac_verify` 方法里面的 `if settings.PERMISSION_MODE == 'role-menu':`
108+ 条件及相关代码
109+
110+ ### Casbin
111+
112+ - 删除 `backend/app/admin/api/v1/sys/casbin.py`、`backend/app/admin/crud/crud_casbin.py`、
113+ `backend/app/admin/model/casbin_rule.py`、`backend/app/admin/schema/casbin_rule.py`、
114+ `backend/app/admin/service/casbin_service.py` 文件
115+ - 删除 `backend/core/conf.py` 文件中的 `RBAC_CASBIN_EXCLUDE`
116+ - 删除 `backend/common/security/rbac.py` 文件中 `enforcer` 方法
117+ - 删除 `backend/common/security/rbac.py` 文件中 `rbac_verify` 方法里面的 `if settings.PERMISSION_MODE == 'role-menu':`
118+ 条件和 else 条件中的相关代码
119+ - 删除 casbin 相关依赖包
0 commit comments