@@ -21,7 +21,7 @@ async def enforcer() -> casbin.AsyncEnforcer:
21
21
22
22
:return:
23
23
"""
24
- # 规则数据作为死数据直接在方法内定义
24
+ # 模型定义:https://casbin.org/zh/docs/category/model
25
25
_CASBIN_RBAC_MODEL_CONF_TEXT = """
26
26
[request_definition]
27
27
r = sub, obj, act
@@ -46,55 +46,73 @@ async def enforcer() -> casbin.AsyncEnforcer:
46
46
47
47
async def rbac_verify (self , request : Request , _token : str = DependsJwtAuth ) -> None :
48
48
"""
49
- RBAC 权限校验
49
+ RBAC 权限校验(鉴权顺序很重要,谨慎修改)
50
50
51
51
:param request:
52
52
:param _token:
53
53
:return:
54
54
"""
55
55
path = request .url .path
56
- # 鉴权白名单
56
+
57
+ # API 鉴权白名单
57
58
if path in settings .TOKEN_REQUEST_PATH_EXCLUDE :
58
59
return
60
+
59
61
# JWT 授权状态强制校验
60
62
if not request .auth .scopes :
61
63
raise TokenError
64
+
62
65
# 超级管理员免校验
63
66
if request .user .is_superuser :
64
67
return
65
- # 检测角色数据权限范围
68
+
69
+ # 检测用户角色
66
70
user_roles = request .user .roles
67
71
if not user_roles :
68
- raise AuthorizationError (msg = '用户未分配角色,授权失败' )
72
+ raise AuthorizationError
73
+
74
+ # 检测用户所属角色菜单
69
75
if not any (len (role .menus ) > 0 for role in user_roles ):
70
- raise AuthorizationError (msg = '用户所属角色未分配菜单,授权失败' )
76
+ raise AuthorizationError
77
+
71
78
# 检测后台管理操作权限
72
79
method = request .method
73
80
if method != MethodType .GET or method != MethodType .OPTIONS :
74
81
if not request .user .is_staff :
75
82
raise AuthorizationError (msg = '用户已被禁止后台管理操作,请联系系统管理员' )
83
+
76
84
# 数据权限范围
77
85
if any (role .data_scope == 1 for role in user_roles ):
78
86
return
87
+
79
88
# RBAC 鉴权
80
89
if settings .PERMISSION_MODE == 'role-menu' :
81
90
path_auth_perm = getattr (request .state , 'permission' , None )
82
- # 没有菜单权限标识不校验
91
+
92
+ # 没有菜单操作权限标识不校验
83
93
if not path_auth_perm :
84
94
return
95
+
96
+ # 菜单鉴权白名单
85
97
if path_auth_perm in settings .RBAC_ROLE_MENU_EXCLUDE :
86
98
return
99
+
100
+ # 已分配菜单权限校验
87
101
allow_perms = []
88
102
for role in user_roles :
89
103
for menu in role .menus :
90
- if menu .status == StatusType .enable :
104
+ if menu .perms and menu . status == StatusType .enable :
91
105
allow_perms .extend (menu .perms .split (',' ))
92
106
if path_auth_perm not in allow_perms :
93
107
raise AuthorizationError
94
108
else :
95
- user_uuid = request . user . uuid
109
+ # casbin 鉴权白名单
96
110
if (method , path ) in settings .RBAC_CASBIN_EXCLUDE :
97
111
return
112
+
113
+ # casbin 权限校验
114
+ # 实现机制:backend/app/admin/api/v1/sys/casbin.py
115
+ user_uuid = request .user .uuid
98
116
enforcer = await self .enforcer ()
99
117
if not enforcer .enforce (user_uuid , path , method ):
100
118
raise AuthorizationError
0 commit comments