@@ -21,7 +21,7 @@ async def enforcer() -> casbin.AsyncEnforcer:
2121
2222 :return:
2323 """
24- # 规则数据作为死数据直接在方法内定义
24+ # 模型定义:https://casbin.org/zh/docs/category/model
2525 _CASBIN_RBAC_MODEL_CONF_TEXT = """
2626 [request_definition]
2727 r = sub, obj, act
@@ -46,55 +46,73 @@ async def enforcer() -> casbin.AsyncEnforcer:
4646
4747 async def rbac_verify (self , request : Request , _token : str = DependsJwtAuth ) -> None :
4848 """
49- RBAC 权限校验
49+ RBAC 权限校验(鉴权顺序很重要,谨慎修改)
5050
5151 :param request:
5252 :param _token:
5353 :return:
5454 """
5555 path = request .url .path
56- # 鉴权白名单
56+
57+ # API 鉴权白名单
5758 if path in settings .TOKEN_REQUEST_PATH_EXCLUDE :
5859 return
60+
5961 # JWT 授权状态强制校验
6062 if not request .auth .scopes :
6163 raise TokenError
64+
6265 # 超级管理员免校验
6366 if request .user .is_superuser :
6467 return
65- # 检测角色数据权限范围
68+
69+ # 检测用户角色
6670 user_roles = request .user .roles
6771 if not user_roles :
68- raise AuthorizationError (msg = '用户未分配角色,授权失败' )
72+ raise AuthorizationError
73+
74+ # 检测用户所属角色菜单
6975 if not any (len (role .menus ) > 0 for role in user_roles ):
70- raise AuthorizationError (msg = '用户所属角色未分配菜单,授权失败' )
76+ raise AuthorizationError
77+
7178 # 检测后台管理操作权限
7279 method = request .method
7380 if method != MethodType .GET or method != MethodType .OPTIONS :
7481 if not request .user .is_staff :
7582 raise AuthorizationError (msg = '用户已被禁止后台管理操作,请联系系统管理员' )
83+
7684 # 数据权限范围
7785 if any (role .data_scope == 1 for role in user_roles ):
7886 return
87+
7988 # RBAC 鉴权
8089 if settings .PERMISSION_MODE == 'role-menu' :
8190 path_auth_perm = getattr (request .state , 'permission' , None )
82- # 没有菜单权限标识不校验
91+
92+ # 没有菜单操作权限标识不校验
8393 if not path_auth_perm :
8494 return
95+
96+ # 菜单鉴权白名单
8597 if path_auth_perm in settings .RBAC_ROLE_MENU_EXCLUDE :
8698 return
99+
100+ # 已分配菜单权限校验
87101 allow_perms = []
88102 for role in user_roles :
89103 for menu in role .menus :
90- if menu .status == StatusType .enable :
104+ if menu .perms and menu . status == StatusType .enable :
91105 allow_perms .extend (menu .perms .split (',' ))
92106 if path_auth_perm not in allow_perms :
93107 raise AuthorizationError
94108 else :
95- user_uuid = request . user . uuid
109+ # casbin 鉴权白名单
96110 if (method , path ) in settings .RBAC_CASBIN_EXCLUDE :
97111 return
112+
113+ # casbin 权限校验
114+ # 实现机制:backend/app/admin/api/v1/sys/casbin.py
115+ user_uuid = request .user .uuid
98116 enforcer = await self .enforcer ()
99117 if not enforcer .enforce (user_uuid , path , method ):
100118 raise AuthorizationError
0 commit comments