1
1
# coding=utf-8
2
2
"""
3
- @project: maxkb
3
+ @project: MaxKB
4
4
@Author:虎虎
5
5
@file: authenticate.py
6
6
@date:2024/3/14 03:02
7
7
@desc: 用户认证
8
8
"""
9
+ from django .core .cache import cache
9
10
from django .db .models import QuerySet
11
+ from django .utils .translation import gettext_lazy as _
12
+
10
13
from common .auth .handle .auth_base_handle import AuthBaseHandle
11
- from common .constants .authentication_type import AuthenticationType
12
14
from 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
14
17
from common .exception .app_exception import AppAuthenticationFailed
15
18
from 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 )
18
105
19
106
20
107
class UserToken (AuthBaseHandle ):
@@ -25,12 +112,13 @@ def support(self, request, token: str, get_token_details):
25
112
return True
26
113
27
114
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 )
29
117
if cache_token is None :
30
118
raise AppAuthenticationFailed (1002 , _ ('Login expired' ))
31
119
auth_details = get_token_details ()
120
+ # 当前工作空间
121
+ current_workspace = auth_details ['current_workspace' ]
32
122
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