11# coding=utf-8
22"""
3- @project: maxkb
3+ @project: MaxKB
44 @Author:虎虎
55 @file: authenticate.py
66 @date:2024/3/14 03:02
77 @desc: 用户认证
88"""
9+ from django .core .cache import cache
910from django .db .models import QuerySet
11+ from django .utils .translation import gettext_lazy as _
12+
1013from common .auth .handle .auth_base_handle import AuthBaseHandle
11- from common .constants .authentication_type import AuthenticationType
1214from common .constants .cache_version import Cache_Version
13- from common .constants .permission_constants import Auth , RoleConstants
15+ from common .constants .permission_constants import Auth , RoleConstants , get_default_permission_list_by_role
16+ from common .database_model_manage .database_model_manage import DatabaseModelManage
1417from common .exception .app_exception import AppAuthenticationFailed
1518from users .models import User
16- from django .core .cache import cache
17- from django .utils .translation import gettext_lazy as _
19+
20+
21+ def get_permission_list (user_id ,
22+ workspace_id ,
23+ workspace_user_role_mapping_model ,
24+ workspace_model ,
25+ role_model ,
26+ role_permission_mapping_model ):
27+ version , get_key = Cache_Version .PERMISSION_LIST .value
28+ key = get_key (user_id , workspace_id )
29+ # 获取权限列表
30+ is_query_model = workspace_user_role_mapping_model is not None and workspace_model is not None and role_model is not None and role_permission_mapping_model is not None
31+ permission_list = cache .get (key , version = version )
32+ if permission_list is None :
33+ if is_query_model :
34+ # 获取工作空间 用户 角色映射数据
35+ workspace_user_role_mapping_list = QuerySet (workspace_user_role_mapping_model ).filter (user_id = user_id )
36+ # 获取角色权限映射数据
37+ role_permission_mapping_list = QuerySet (role_permission_mapping_model ).filter (
38+ role_id__in = [workspace_user_role_mapping .role_id for workspace_user_role_mapping in
39+ workspace_user_role_mapping_list ])
40+ permission_list = [role_model .id for role_model in role_permission_mapping_list ]
41+ cache .set (key , permission_list , version = version )
42+ else :
43+ permission_list = get_default_permission_list_by_role (RoleConstants .ADMIN )
44+ cache .set (key , permission_list , version = version )
45+ return permission_list
46+
47+
48+ def get_workspace_list (user_id ,
49+ workspace_id ,
50+ workspace_user_role_mapping_model ,
51+ workspace_model ,
52+ role_model ,
53+ role_permission_mapping_model ):
54+ version , get_key = Cache_Version .WORKSPACE_LIST .value
55+ key = get_key (user_id )
56+ workspace_list = cache .get (key , version = version )
57+ # 获取权限列表
58+ is_query_model = workspace_user_role_mapping_model is not None and workspace_model is not None and role_model is not None and role_permission_mapping_model is not None
59+ if workspace_list is None :
60+ if is_query_model :
61+ # 获取工作空间 用户 角色映射数据
62+ workspace_user_role_mapping_list = QuerySet (workspace_user_role_mapping_model ).filter (user_id = user_id )
63+ cache .set (key , [workspace_user_role_mapping .workspace_id for workspace_user_role_mapping in
64+ workspace_user_role_mapping_list ], version = version )
65+ else :
66+ return ["default" ]
67+ return workspace_list
68+
69+
70+ def get_role_list (user ,
71+ workspace_id ,
72+ workspace_user_role_mapping_model ,
73+ workspace_model ,
74+ role_model ,
75+ role_permission_mapping_model ):
76+ version , get_key = Cache_Version .ROLE_LIST .value
77+ key = get_key (user .id , workspace_id )
78+ workspace_list = cache .get (key , version = version )
79+ # 获取权限列表
80+ is_query_model = workspace_user_role_mapping_model is not None and workspace_model is not None and role_model is not None and role_permission_mapping_model is not None
81+ if workspace_list is None :
82+ if is_query_model :
83+ # 获取工作空间 用户 角色映射数据
84+ workspace_user_role_mapping_list = QuerySet (workspace_user_role_mapping_model ).filter (user_id = user .id )
85+ cache .set (key , [workspace_user_role_mapping .role_id for workspace_user_role_mapping in
86+ workspace_user_role_mapping_list ], version = version )
87+ else :
88+ cache .set (key , [user .role ], version = version )
89+ return [user .role ]
90+ return workspace_list
91+
92+
93+ def get_auth (user , workspace_id ):
94+ workspace_user_role_mapping_model = DatabaseModelManage .get_model ("workspace_user_role_mapping" )
95+ workspace_model = DatabaseModelManage .get_model ("workspace_model" )
96+ role_model = DatabaseModelManage .get_model ("role_model" )
97+ role_permission_mapping_model = DatabaseModelManage .get_model ("role_permission_mapping_model" )
98+ workspace_list = get_workspace_list (user .id , workspace_id , workspace_user_role_mapping_model , workspace_model ,
99+ role_model , role_permission_mapping_model )
100+ permission_list = get_permission_list (user .id , workspace_id , workspace_user_role_mapping_model , workspace_model ,
101+ role_model , role_permission_mapping_model )
102+ role_list = get_role_list (user , workspace_id , workspace_user_role_mapping_model , workspace_model ,
103+ role_model , role_permission_mapping_model )
104+ return Auth (workspace_list , workspace_id , role_list , permission_list )
18105
19106
20107class UserToken (AuthBaseHandle ):
@@ -25,12 +112,13 @@ def support(self, request, token: str, get_token_details):
25112 return True
26113
27114 def handle (self , request , token : str , get_token_details ):
28- cache_token = cache .get (token , version = Cache_Version .TOKEN )
115+ version , get_key = Cache_Version .TOKEN .value
116+ cache_token = cache .get (get_key (token ), version = version )
29117 if cache_token is None :
30118 raise AppAuthenticationFailed (1002 , _ ('Login expired' ))
31119 auth_details = get_token_details ()
120+ # 当前工作空间
121+ current_workspace = auth_details ['current_workspace' ]
32122 user = QuerySet (User ).get (id = auth_details ['id' ])
33- role = RoleConstants [user .role ]
34- return user , Auth ([], [],
35- client_id = str (user .id ),
36- client_type = AuthenticationType .SYSTEM_USER .value , current_role = role )
123+ auth = get_auth (user , current_workspace )
124+ return user , auth
0 commit comments