@@ -55,16 +55,20 @@ async def rbac_verify(self, request: Request, _: dict = DependsJwtAuth) -> None:
5555 data_scope = any (role .data_scope == 1 for role in user_roles )
5656 if data_scope :
5757 return
58+ method = request .method
5859 if settings .MENU_PERMISSION :
5960 # 菜单权限校验
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 } '
6163 menu_perms = []
6264 forbid_menu_perms = []
6365 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 )
6872 if path_auth in set (settings .MENU_EXCLUDE ):
6973 return
7074 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:
7377 raise AuthorizationError
7478 else :
7579 # 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 )
8086 if path .split ('/' )[- 1 ] in forbid_menu_path :
8187 raise AuthorizationError (msg = '菜单已禁用,授权失败' )
8288 if (method , path ) in settings .CASBIN_EXCLUDE :
0 commit comments