66 @date:2024/3/14 03:02
77 @desc: 用户认证
88"""
9+ import datetime
10+ from functools import reduce
11+
912from django .core .cache import cache
1013from django .db .models import QuerySet
1114from django .utils .translation import gettext_lazy as _
1215
1316from common .auth .handle .auth_base_handle import AuthBaseHandle
1417from 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
1620from common .database_model_manage .database_model_manage import DatabaseModelManage
1721from common .exception .app_exception import AppAuthenticationFailed
22+ from common .utils .common import group_by
23+ from system_manage .models .workspace_user_permission import WorkspaceUserPermission
1824from users .models import User
1925
2026
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 .taget } "
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 ,
2352 workspace_user_role_mapping_model ,
2453 workspace_model ,
2554 role_model ,
2655 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 )
2959 # 获取权限列表
3060 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
3161 permission_list = cache .get (key , version = version )
@@ -37,71 +67,80 @@ def get_permission_list(user_id,
3767 role_permission_mapping_list = QuerySet (role_permission_mapping_model ).filter (
3868 role_id__in = [workspace_user_role_mapping .role_id for workspace_user_role_mapping in
3969 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 , [])
4186 cache .set (key , permission_list , version = version )
4287 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 , [])
44101 cache .set (key , permission_list , version = version )
45102 return permission_list
46103
47104
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-
70105def get_role_list (user ,
71- workspace_id ,
72106 workspace_user_role_mapping_model ,
73107 workspace_model ,
74108 role_model ,
75109 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 )
78115 workspace_list = cache .get (key , version = version )
79116 # 获取权限列表
80117 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
81118 if workspace_list is None :
82119 if is_query_model :
83120 # 获取工作空间 用户 角色映射数据
84121 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 )
87127 else :
88128 cache .set (key , [user .role ], version = version )
89129 return [user .role ]
90130 return workspace_list
91131
92132
93- def get_auth (user , workspace_id ):
133+ def get_auth (user ):
94134 workspace_user_role_mapping_model = DatabaseModelManage .get_model ("workspace_user_role_mapping" )
95135 workspace_model = DatabaseModelManage .get_model ("workspace_model" )
96136 role_model = DatabaseModelManage .get_model ("role_model" )
97137 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 ,
101140 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 ,
103142 role_model , role_permission_mapping_model )
104- return Auth (workspace_list , workspace_id , role_list , permission_list )
143+ return Auth (role_list , permission_list )
105144
106145
107146class UserToken (AuthBaseHandle ):
@@ -117,8 +156,7 @@ def handle(self, request, token: str, get_token_details):
117156 if cache_token is None :
118157 raise AppAuthenticationFailed (1002 , _ ('Login expired' ))
119158 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 )
122160 user = QuerySet (User ).get (id = auth_details ['id' ])
123- auth = get_auth (user , current_workspace )
161+ auth = get_auth (user )
124162 return user , auth
0 commit comments