@@ -55,16 +55,20 @@ async def rbac_verify(self, request: Request, _: dict = DependsJwtAuth) -> None:
55
55
data_scope = any (role .data_scope == 1 for role in user_roles )
56
56
if data_scope :
57
57
return
58
+ method = request .method
58
59
if settings .MENU_PERMISSION :
59
60
# 菜单权限校验
60
- path_auth = request .url .path .replace (f'{ settings .API_V1_STR } ' , '' ).replace ('/' , ':' )
61
+ # TODO: 改用流行方案,自定义接口权限字段标识
62
+ path_auth = path .split (f'{ settings .API_V1_STR } /' )[- 1 ].replace ('/' , ':' ) + f':{ method } '
61
63
menu_perms = []
62
64
forbid_menu_perms = []
63
65
for role in user_roles :
64
- for menu in role .menus :
65
- menu_perms .append (menu .perms ) if menu .status == StatusType .enable else forbid_menu_perms .append (
66
- menu .perms
67
- )
66
+ if role .menus :
67
+ for menu in role .menus :
68
+ if menu .status == StatusType .enable :
69
+ menu_perms .append (menu .perms )
70
+ else :
71
+ forbid_menu_perms .append (menu .perms )
68
72
if path_auth in set (settings .MENU_EXCLUDE ):
69
73
return
70
74
if path_auth in set ([perm for perms_str in forbid_menu_perms for perm in perms_str .split (',' )]):
@@ -73,10 +77,12 @@ async def rbac_verify(self, request: Request, _: dict = DependsJwtAuth) -> None:
73
77
raise AuthorizationError
74
78
else :
75
79
# casbin 权限校验
76
- method = request .method
77
- forbid_menu_path = [
78
- menu .path for role in user_roles for menu in role .menus if menu .status == StatusType .disable
79
- ]
80
+ forbid_menu_path = []
81
+ for role in user_roles :
82
+ if role .menus :
83
+ for menu in role .menus :
84
+ if menu .status == StatusType .disable :
85
+ forbid_menu_path .append (menu .path )
80
86
if path .split ('/' )[- 1 ] in forbid_menu_path :
81
87
raise AuthorizationError (msg = '菜单已禁用,授权失败' )
82
88
if (method , path ) in settings .CASBIN_EXCLUDE :
0 commit comments