6
6
@date:2024/3/14 03:02
7
7
@desc: 用户认证
8
8
"""
9
+ import datetime
10
+ from functools import reduce
11
+
9
12
from django .core .cache import cache
10
13
from django .db .models import QuerySet
11
14
from django .utils .translation import gettext_lazy as _
12
15
13
16
from common .auth .handle .auth_base_handle import AuthBaseHandle
14
17
from common .constants .cache_version import Cache_Version
15
- from common .constants .permission_constants import Auth , RoleConstants , get_default_permission_list_by_role
18
+ from common .constants .permission_constants import Auth , RoleConstants , get_default_permission_list_by_role , \
19
+ PermissionConstants
16
20
from common .database_model_manage .database_model_manage import DatabaseModelManage
17
21
from common .exception .app_exception import AppAuthenticationFailed
22
+ from common .utils .common import group_by
23
+ from system_manage .models .workspace_user_permission import WorkspaceUserPermission
18
24
from users .models import User
19
25
20
26
21
- def get_permission_list (user_id ,
22
- workspace_id ,
27
+ def get_permission (permission_id ):
28
+ if isinstance (permission_id , PermissionConstants ):
29
+ permission_id = permission_id .value
30
+ return f"{ permission_id } "
31
+
32
+
33
+ def get_workspace_permission (permission_id , workspace_id ):
34
+ if isinstance (permission_id , PermissionConstants ):
35
+ permission_id = permission_id .value
36
+ return f"{ permission_id } :/WORKSPACE/{ workspace_id } "
37
+
38
+
39
+ def get_workspace_resource_permission_list (permission_id , workspace_id , workspace_user_permission_dict ):
40
+ workspace_user_permission_list = workspace_user_permission_dict .get (workspace_id )
41
+ if workspace_user_permission_list is None :
42
+ return [
43
+ get_workspace_permission (permission_id , workspace_id ), get_permission (permission_id )]
44
+ return [
45
+ f"{ permission_id } :/WORKSPACE/{ workspace_id } /{ workspace_user_permission .auth_target_type } /{ workspace_user_permission .target } "
46
+ for workspace_user_permission in
47
+ workspace_user_permission_list if workspace_user_permission .is_auth ] + [
48
+ get_workspace_permission (permission_id , workspace_id ), get_permission (permission_id )]
49
+
50
+
51
+ def get_permission_list (user ,
23
52
workspace_user_role_mapping_model ,
24
53
workspace_model ,
25
54
role_model ,
26
55
role_permission_mapping_model ):
27
- version , get_key = Cache_Version .PERMISSION_LIST .value
28
- key = get_key (user_id , workspace_id )
56
+ user_id = user .id
57
+ version = Cache_Version .PERMISSION_LIST .get_version ()
58
+ key = Cache_Version .PERMISSION_LIST .get_key (user_id = user_id )
29
59
# 获取权限列表
30
60
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
61
permission_list = cache .get (key , version = version )
@@ -37,71 +67,80 @@ def get_permission_list(user_id,
37
67
role_permission_mapping_list = QuerySet (role_permission_mapping_model ).filter (
38
68
role_id__in = [workspace_user_role_mapping .role_id for workspace_user_role_mapping in
39
69
workspace_user_role_mapping_list ])
40
- permission_list = [role_model .id for role_model in role_permission_mapping_list ]
70
+ role_dict = group_by (role_permission_mapping_list , lambda item : item .get ('role_id' ))
71
+
72
+ workspace_user_permission_list = QuerySet (WorkspaceUserPermission ).filter (
73
+ workspace_id__in = [workspace_user_role .workspace_id for workspace_user_role in
74
+ workspace_user_role_mapping_list ])
75
+ workspace_user_permission_dict = group_by (workspace_user_permission_list ,
76
+ key = lambda item : item .workspace_id )
77
+ permission_list = [
78
+ get_workspace_resource_permission_list (role_permission_mapping .permission_id ,
79
+ role_dict .get (role_permission_mapping .role_id ).workspace_id ,
80
+ workspace_user_permission_dict )
81
+ for role_permission_mapping in
82
+ role_permission_mapping_list ]
83
+
84
+ # 将二维数组扁平为一维
85
+ permission_list = reduce (lambda x , y : [* x , * y ], permission_list , [])
41
86
cache .set (key , permission_list , version = version )
42
87
else :
43
- permission_list = get_default_permission_list_by_role (RoleConstants .ADMIN )
88
+ workspace_id_list = ['default' ]
89
+ workspace_user_permission_list = QuerySet (WorkspaceUserPermission ).filter (
90
+ workspace_id__in = workspace_id_list )
91
+
92
+ workspace_user_permission_dict = group_by (workspace_user_permission_list ,
93
+ key = lambda item : item .workspace_id )
94
+ permission_list = get_default_permission_list_by_role (RoleConstants [user .role ])
95
+ permission_list = [
96
+ get_workspace_resource_permission_list (permission , 'default' , workspace_user_permission_dict ) for
97
+ permission
98
+ in permission_list ]
99
+ # 将二维数组扁平为一维
100
+ permission_list = reduce (lambda x , y : [* x , * y ], permission_list , [])
44
101
cache .set (key , permission_list , version = version )
45
102
return permission_list
46
103
47
104
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
105
def get_role_list (user ,
71
- workspace_id ,
72
106
workspace_user_role_mapping_model ,
73
107
workspace_model ,
74
108
role_model ,
75
109
role_permission_mapping_model ):
76
- version , get_key = Cache_Version .ROLE_LIST .value
77
- key = get_key (user .id , workspace_id )
110
+ """
111
+ 获取当前用户的角色列表
112
+ """
113
+ version = Cache_Version .ROLE_LIST .get_version ()
114
+ key = Cache_Version .ROLE_LIST .get_key (user_id = user .id )
78
115
workspace_list = cache .get (key , version = version )
79
116
# 获取权限列表
80
117
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
118
if workspace_list is None :
82
119
if is_query_model :
83
120
# 获取工作空间 用户 角色映射数据
84
121
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 )
122
+ cache .set (key ,
123
+ [f"{ workspace_user_role_mapping .role_id } :/WORKSPACE/{ workspace_user_role_mapping .workspace_id } "
124
+ for
125
+ workspace_user_role_mapping in
126
+ workspace_user_role_mapping_list ] + [user .role ], version = version )
87
127
else :
88
128
cache .set (key , [user .role ], version = version )
89
129
return [user .role ]
90
130
return workspace_list
91
131
92
132
93
- def get_auth (user , workspace_id ):
133
+ def get_auth (user ):
94
134
workspace_user_role_mapping_model = DatabaseModelManage .get_model ("workspace_user_role_mapping" )
95
135
workspace_model = DatabaseModelManage .get_model ("workspace_model" )
96
136
role_model = DatabaseModelManage .get_model ("role_model" )
97
137
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 ,
138
+
139
+ permission_list = get_permission_list (user , workspace_user_role_mapping_model , workspace_model ,
101
140
role_model , role_permission_mapping_model )
102
- role_list = get_role_list (user , workspace_id , workspace_user_role_mapping_model , workspace_model ,
141
+ role_list = get_role_list (user , workspace_user_role_mapping_model , workspace_model ,
103
142
role_model , role_permission_mapping_model )
104
- return Auth (workspace_list , workspace_id , role_list , permission_list )
143
+ return Auth (role_list , permission_list )
105
144
106
145
107
146
class UserToken (AuthBaseHandle ):
@@ -117,8 +156,7 @@ def handle(self, request, token: str, get_token_details):
117
156
if cache_token is None :
118
157
raise AppAuthenticationFailed (1002 , _ ('Login expired' ))
119
158
auth_details = get_token_details ()
120
- # 当前工作空间
121
- current_workspace = auth_details ['current_workspace' ]
159
+ cache .touch (token , timeout = datetime .timedelta (seconds = 60 * 60 * 2 ).seconds , version = version )
122
160
user = QuerySet (User ).get (id = auth_details ['id' ])
123
- auth = get_auth (user , current_workspace )
161
+ auth = get_auth (user )
124
162
return user , auth
0 commit comments