Skip to content

Commit 526290b

Browse files
committed
fix: Folder auth permission
1 parent 4ffdb46 commit 526290b

File tree

3 files changed

+44
-20
lines changed

3 files changed

+44
-20
lines changed

apps/common/constants/permission_constants.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ class PermissionConstants(Enum):
558558
)
559559
TOOL_FOLDER_READ = Permission(
560560
group=Group.TOOL_FOLDER, operate=Operate.READ, role_list=[RoleConstants.ADMIN, RoleConstants.USER],
561-
parent_group=[WorkspaceGroup.TOOL, UserGroup.TOOL],
561+
parent_group=[UserGroup.TOOL],
562562
resource_permission_group_list=[ResourcePermissionConst.TOOL_VIEW]
563563
)
564564
TOOL_FOLDER_CREATE = Permission(
@@ -629,7 +629,7 @@ class PermissionConstants(Enum):
629629
KNOWLEDGE_FOLDER_READ = Permission(
630630
group=Group.KNOWLEDGE_FOLDER, operate=Operate.READ, role_list=[RoleConstants.ADMIN, RoleConstants.USER],
631631
resource_permission_group_list=[ResourcePermissionConst.KNOWLEDGE_VIEW],
632-
parent_group = [WorkspaceGroup.KNOWLEDGE, UserGroup.KNOWLEDGE]
632+
parent_group = [UserGroup.KNOWLEDGE]
633633
)
634634
KNOWLEDGE_FOLDER_CREATE = Permission(
635635
group=Group.KNOWLEDGE_FOLDER, operate=Operate.CREATE, role_list=[RoleConstants.ADMIN, RoleConstants.USER],
@@ -961,7 +961,7 @@ class PermissionConstants(Enum):
961961
)
962962
APPLICATION_FOLDER_READ = Permission(group=Group.APPLICATION_FOLDER, operate=Operate.READ,
963963
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
964-
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],
964+
parent_group=[UserGroup.APPLICATION],
965965
resource_permission_group_list=[ResourcePermissionConst.APPLICATION_VIEW]
966966
)
967967
APPLICATION_FOLDER_CREATE = Permission(group=Group.APPLICATION_FOLDER, operate=Operate.CREATE,

apps/folders/serializers/folder.py

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
from application.models.application import Application, ApplicationFolder
1111
from application.serializers.application import ApplicationOperateSerializer
1212
from application.serializers.application_folder import ApplicationFolderTreeSerializer
13-
from common.constants.permission_constants import Group, ResourcePermission, ResourcePermissionRole
13+
from common.constants.permission_constants import Group, ResourcePermission, ResourcePermissionRole, RoleConstants
14+
from common.database_model_manage.database_model_manage import DatabaseModelManage
1415
from common.exception.app_exception import AppApiException
1516
from folders.api.folder import FolderCreateRequest
1617
from knowledge.models import KnowledgeFolder, Knowledge
@@ -300,30 +301,52 @@ def _check_tree_integrity(queryset):
300301
return True # 需要重建
301302
return False
302303

304+
@staticmethod
305+
def _having_read_permission_by_role(user_id: str, workspace_id: str, source: str):
306+
workspace_user_role_mapping_model = DatabaseModelManage.get_model("workspace_user_role_mapping")
307+
role_permission_mapping_model = DatabaseModelManage.get_model("role_permission_mapping_model")
308+
is_x_pack_ee = workspace_user_role_mapping_model is not None and role_permission_mapping_model is not None
309+
if is_x_pack_ee:
310+
return QuerySet(workspace_user_role_mapping_model).select_related('role', 'user').filter(
311+
workspace_id=workspace_id, user_id=user_id,
312+
role__type=RoleConstants.USER.value.__str__(),
313+
role__rolepermission__permission_id=f"{source}_FOLDER:READ"
314+
).exists()
315+
316+
return False
317+
303318
def get_folder_tree(self,
304319
current_user, name=None):
305320
self.is_valid(raise_exception=True)
306-
Folder = get_folder_type(self.data.get('source')) # noqa
321+
user_id = current_user.id
322+
workspace_id = self.data.get('workspace_id')
323+
source = self.data.get('source')
307324

308-
# 检查特定工作空间的树结构完整性
309-
workspace_folders = Folder.objects.filter(workspace_id=self.data.get('workspace_id'))
325+
Folder = get_folder_type(source) # noqa
310326

327+
# 检查特定工作空间的树结构完整性
328+
workspace_folders = Folder.objects.filter(workspace_id=workspace_id)
311329
# 如果发现数据不一致,重建整个表(这是 MPTT 的限制)
312330
if self._check_tree_integrity(workspace_folders):
313331
Folder.objects.rebuild()
314332

315-
workspace_manage = is_workspace_manage(current_user.id, self.data.get('workspace_id'))
333+
workspace_manage = is_workspace_manage(user_id, workspace_id)
316334

317-
base_q = Q(workspace_id=self.data.get('workspace_id'))
335+
base_q = Q(workspace_id=workspace_id)
318336

319337
if name is not None:
320338
base_q &= Q(name__contains=name)
321339
if not workspace_manage:
340+
having_read_permission_by_role = self._having_read_permission_by_role(user_id, workspace_id, source)
341+
permission_condition = ['VIEW']
342+
if having_read_permission_by_role:
343+
permission_condition = ['VIEW', 'ROLE']
344+
322345
base_q &= (Q(id__in=WorkspaceUserResourcePermission.objects.filter(user_id=current_user.id,
323346
auth_target_type=self.data.get('source'),
324347
workspace_id=self.data.get(
325348
'workspace_id'),
326-
permission_list__contains=['VIEW'])
349+
permission_list__overlap=permission_condition)
327350
.values_list(
328351
'target', flat=True)) | Q(id=self.data.get('workspace_id')))
329352

@@ -332,4 +355,5 @@ def get_folder_tree(self,
332355
TreeSerializer = get_folder_tree_serializer(self.data.get('source')) # noqa
333356
serializer = TreeSerializer(nodes, many=True)
334357

335-
return [d for d in serializer.data if d.get('id') == d.get('workspace_id')] if name is None else serializer.data # 这是可序列化的字典
358+
return [d for d in serializer.data if
359+
d.get('id') == d.get('workspace_id')] if name is None else serializer.data # 这是可序列化的字典

apps/system_manage/views/user_resource_permission.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,16 +120,16 @@ class WorkspaceResourceUserPermissionView(APIView):
120120
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"),
121121
lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
122122
operate=Operate.AUTH,
123-
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource')}/{kwargs.get('target')}"),
123+
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}"),
124124
ViewPermission([RoleConstants.USER.get_workspace_role()],
125125
[lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
126126
operate=Operate.SELF,
127-
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource')}/{kwargs.get('target')}")],
127+
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}")],
128128
CompareConstants.AND),
129129
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
130130
def get(self, request: Request, workspace_id: str, target: str, resource: str):
131131
return result.success(ResourceUserPermissionSerializer(
132-
data={'workspace_id': workspace_id, "target": target, 'auth_target_type': resource,
132+
data={'workspace_id': workspace_id, "target": target, 'auth_target_type': resource.replace('_FOLDER',''),
133133
}).list(
134134
{'username': request.query_params.get("username"), 'nick_name': request.query_params.get("nick_name"),
135135
'permission': request.query_params.getlist("permission[]")
@@ -154,16 +154,16 @@ def get(self, request: Request, workspace_id: str, target: str, resource: str):
154154
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"),
155155
lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
156156
operate=Operate.AUTH,
157-
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource')}/{kwargs.get('target')}"),
157+
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}"),
158158
ViewPermission([RoleConstants.USER.get_workspace_role()],
159159
[lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
160160
operate=Operate.SELF,
161-
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource')}/{kwargs.get('target')}")],
161+
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}")],
162162
CompareConstants.AND),
163163
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
164164
def put(self, request: Request, workspace_id: str, target: str, resource: str):
165165
return result.success(ResourceUserPermissionSerializer(
166-
data={'workspace_id': workspace_id, "target": target, 'auth_target_type': resource, })
166+
data={'workspace_id': workspace_id, "target": target, 'auth_target_type': resource.replace('_FOLDER',''), })
167167
.edit(instance=request.data, current_user_id=request.user.id))
168168

169169
class Page(APIView):
@@ -184,17 +184,17 @@ class Page(APIView):
184184
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"),
185185
lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
186186
operate=Operate.AUTH,
187-
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource')}/{kwargs.get('target')}"),
187+
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}"),
188188
ViewPermission([RoleConstants.USER.get_workspace_role()],
189189
[lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
190190
operate=Operate.SELF,
191-
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource')}/{kwargs.get('target')}")],
191+
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}")],
192192
CompareConstants.AND),
193193
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
194194
def get(self, request: Request, workspace_id: str, target: str, resource: str, current_page: int,
195195
page_size: int):
196196
return result.success(ResourceUserPermissionSerializer(
197-
data={'workspace_id': workspace_id, "target": target, 'auth_target_type': resource, }
197+
data={'workspace_id': workspace_id, "target": target, 'auth_target_type': resource.replace('_FOLDER',''), }
198198
).page({'username': request.query_params.get("username"),
199199
'role': request.query_params.get("role"),
200200
'nick_name': request.query_params.get("nick_name"),

0 commit comments

Comments
 (0)