From eddc46e40d63b03202972bf6d013dcfdf598d8e7 Mon Sep 17 00:00:00 2001 From: zhuangtianxiang <2913129173@qq.com> Date: Fri, 9 May 2025 13:11:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(dify):=20=E6=9B=B4=E6=96=B0=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=8E=A7=E5=88=B6=E5=B9=B6=E5=A2=9E=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 AppEntity 和 WorkflowData 中添加 createId 和 deptId 字段,用于记录创建者和部门信息 - 更新 MenuServiceImplTest 中的菜单权限,增加新的操作权限并调整现有权限- 修改 V1ChatController 中的 sendChatMessage 方法权限,从 query 改为 send - 新增 V1ChatController 中的 stopMessagesStream 方法权限,添加 stop 权限 - 更新 V1DatasetController 中的 retrieve 方法权限,从 query 改为 retrieve - 修改V1ServerController 中的 initAppApiKey 和 initDatasetApiKey 方法权限,从 create 改为 init - 在 V1WorkflowController 中的 list 方法添加数据权限控制 --- .../dify/controller/V1ChatController.java | 4 +- .../dify/controller/V1DatasetController.java | 2 +- .../dify/controller/V1ServerController.java | 7 ++- .../dify/controller/V1WorkflowController.java | 2 + .../dify/modules/dify/entity/AppEntity.java | 6 +++ .../modules/dify/entity/WorkflowData.java | 6 +++ .../service/impl/MenuServiceImplTest.java | 47 +++++++++++-------- 7 files changed, 50 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java index bde45fc..71785eb 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java @@ -1,6 +1,7 @@ package com.zsc.edu.dify.modules.dify.controller; import com.zsc.edu.dify.exception.ExceptionUtil; +import com.zsc.edu.dify.framework.mybatisplus.DataPermission; import com.zsc.edu.dify.framework.security.SecurityUtil; import com.zsc.edu.dify.modules.dify.service.AppEntityService; import com.zsc.edu.dify.modules.operationLog.entity.OperationLogAnnotation; @@ -40,7 +41,7 @@ public class V1ChatController { * apikey 建议在数据库进行存储,前端调用时传智能体 id,从数据库查询 */ @PostMapping("/completions/{appId}") - @PreAuthorize("hasAuthority('dify:chat:query')") + @PreAuthorize("hasAuthority('dify:chat:send')") @OperationLogAnnotation(content = "'dify对话'", operationType = "发送") public ChatMessageSendResponse sendChatMessage( @RequestBody ChatMessageSendRequest sendRequest, @@ -92,6 +93,7 @@ public class V1ChatController { * @param taskId 任务id */ @PatchMapping("/stream/stop") + @PreAuthorize("hasAuthority('dify:chat:stop')") public void stopMessagesStream(@RequestParam String taskId, @RequestParam String appId) { String apiKey = appEntityService.getApikey(appId); String userId = SecurityUtil.getUserInfo().id.toString(); diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1DatasetController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1DatasetController.java index 992d156..1632c80 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1DatasetController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1DatasetController.java @@ -120,7 +120,7 @@ public class V1DatasetController { * @return */ @GetMapping("/retrieve") - @PreAuthorize("hasAuthority('dify:dataset:query')") + @PreAuthorize("hasAuthority('dify:dataset:retrieve')") public RetrieveResponse retrieve(@RequestBody RetrieveRequest request){ return difyDataset.retrieve(request); } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java index 520b4bb..871b84a 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java @@ -1,6 +1,7 @@ package com.zsc.edu.dify.modules.dify.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zsc.edu.dify.framework.mybatisplus.DataPermission; import com.zsc.edu.dify.modules.dify.entity.AppEntity; import com.zsc.edu.dify.modules.dify.service.AppEntityService; import com.zsc.edu.dify.modules.operationLog.entity.OperationLogAnnotation; @@ -31,6 +32,7 @@ public class V1ServerController { */ @GetMapping("/apps") @PreAuthorize("hasAuthority('dify:server:query')") + @DataPermission public List getApps(String mode, String name) { return appEntityService.getApps(mode, name); } @@ -63,7 +65,7 @@ public class V1ServerController { * @return */ @PostMapping("/api-key/init/{id}") - @PreAuthorize("hasAuthority('dify:server:create')") + @PreAuthorize("hasAuthority('dify:server:init')") public List initAppApiKey(@PathVariable("id") String id) { return difyServer.initAppApiKey(id); } @@ -83,7 +85,7 @@ public class V1ServerController { * @return */ @PostMapping("/api-key/dataset/init") - @PreAuthorize("hasAuthority('dify:server:create')") + @PreAuthorize("hasAuthority('dify:server:init')") public List initDatasetApiKey() { return difyServer.initDatasetApiKey(); } @@ -107,6 +109,7 @@ public class V1ServerController { */ @GetMapping("/apps/enabled") @PreAuthorize("hasAuthority('dify:server:query')") + @DataPermission public List getEnableApps() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(AppEntity::isEnabled, true); diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1WorkflowController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1WorkflowController.java index 2f0a4d6..910bd96 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1WorkflowController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1WorkflowController.java @@ -1,6 +1,7 @@ package com.zsc.edu.dify.modules.dify.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.zsc.edu.dify.framework.mybatisplus.DataPermission; import com.zsc.edu.dify.framework.security.SecurityUtil; import com.zsc.edu.dify.modules.dify.entity.WorkflowData; import com.zsc.edu.dify.modules.dify.service.AppEntityService; @@ -104,6 +105,7 @@ public class V1WorkflowController { */ @GetMapping("/list/{appId}") @PreAuthorize("hasAuthority('dify:workflow:query')") + @DataPermission public List list(@PathVariable String appId){ return difyWorkflowService.list(new QueryWrapper().eq("app_id",appId)); } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppEntity.java b/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppEntity.java index 9324f6e..c98c04f 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppEntity.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppEntity.java @@ -1,5 +1,6 @@ package com.zsc.edu.dify.modules.dify.entity; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.zsc.edu.dify.framework.json.JsonbTypeHandler; @@ -46,4 +47,9 @@ public class AppEntity extends AppsResponseVO { @TableField(exist = false) private List children = null; + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + @TableField(value = "dept_id", fill = FieldFill.INSERT) + private Long deptId; } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/entity/WorkflowData.java b/src/main/java/com/zsc/edu/dify/modules/dify/entity/WorkflowData.java index cfebc62..373d1e5 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/entity/WorkflowData.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/entity/WorkflowData.java @@ -25,4 +25,10 @@ public class WorkflowData { private Long userId; private String appId; + + @TableField(value = "create_id", fill = FieldFill.INSERT) + private Long createId; + + @TableField(value = "dept_id", fill = FieldFill.INSERT) + private Long deptId; } diff --git a/src/test/java/com/zsc/edu/dify/modules/system/service/impl/MenuServiceImplTest.java b/src/test/java/com/zsc/edu/dify/modules/system/service/impl/MenuServiceImplTest.java index b7b29fd..7deab2b 100644 --- a/src/test/java/com/zsc/edu/dify/modules/system/service/impl/MenuServiceImplTest.java +++ b/src/test/java/com/zsc/edu/dify/modules/system/service/impl/MenuServiceImplTest.java @@ -71,22 +71,29 @@ class MenuServiceImplTest { Menu bulletinDelete = new Menu(bulletin.getId(), Menu.Type.OPERATION, "bulletinDelete", null, "公告删除", null, true, false, 1, "message:bulletin:delete", ""); Menu operationLogQuery = new Menu(operationLog.getId(), Menu.Type.OPERATION, "operationLogQuery", null, "操作日志查询", null, true, false, 1, "operationLog:query", ""); Menu operationLogDelete = new Menu(operationLog.getId(), Menu.Type.OPERATION, "operationLogDelete", null, "操作日志删除", null, true, false, 1, "operationLog:delete", ""); - Menu difyChatQuery = new Menu(dify.getId(), Menu.Type.OPERATION, "difyChatQuery", null, "difyChat查询", null, true, false, 1, "difyChat:query", ""); - Menu difyChatCreate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyChatCreate", null, "difyChat新增", null, true, false, 1, "difyChat:create", ""); - Menu difyChatUpdate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyChatUpdate", null, "difyChat修改", null, true, false, 1, "difyChat:update", ""); - Menu difyChatDelete = new Menu(dify.getId(), Menu.Type.OPERATION, "difyChatDelete", null, "difyChat删除", null, true, false, 1, "difyChat:delete", ""); - Menu difyServerQuery = new Menu(dify.getId(), Menu.Type.OPERATION, "difyServerQuery", null, "difyServer查询", null, true, false, 1, "difyServer:query", ""); - Menu difyServerCreate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyServerCreate", null, "difyServer新增", null, true, false, 1, "difyServer:create", ""); - Menu difyServerUpdate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyServerUpdate", null, "difyServer修改", null, true, false, 1, "difyServer:update", ""); - Menu difyServerDelete = new Menu(dify.getId(), Menu.Type.OPERATION, "difyServerDelete", null, "difyServer删除", null, true, false, 1, "difyServer:delete", ""); - Menu difyDataSetQuery = new Menu(dify.getId(), Menu.Type.OPERATION, "difyDataSetQuery", null, "difyDataSet查询", null, true, false, 1, "difyDataSet:query", ""); - Menu difyDataSetCreate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyDataSetCreate", null, "difyDataSet新增", null, true, false, 1, "difyDataSet:create", ""); - Menu difyDataSetUpdate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyDataSetUpdate", null, "difyDataSet修改", null, true, false, 1, "difyDataSet:update", ""); - Menu difyDataSetDelete = new Menu(dify.getId(), Menu.Type.OPERATION, "difyDataSetDelete", null, "difyDataSet删除", null, true, false, 1, "difyDataSet:delete", ""); - Menu difyWorkFlowQuery = new Menu(dify.getId(), Menu.Type.OPERATION, "difyWorkFlowQuery", null, "difyWorkFlow查询", null, true, false, 1, "difyWorkFlow:query", ""); - Menu difyWorkFlowCreate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyWorkFlowCreate", null, "difyWorkFlow新增", null, true, false, 1, "difyWorkFlow:create", ""); - Menu difyWorkFlowUpdate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyWorkFlowUpdate", null, "difyWorkFlow修改", null, true, false, 1, "difyWorkFlow:update", ""); - Menu difyWorkFlowDelete = new Menu(dify.getId(), Menu.Type.OPERATION, "difyWorkFlowDelete", null, "difyWorkFlow删除", null, true, false, 1, "difyWorkFlow:delete", ""); + Menu difyChatQuery = new Menu(dify.getId(), Menu.Type.OPERATION, "difyChatQuery", null, "difyChat查询", null, true, false, 1, "dify:chat:query", ""); + Menu difyChatCreate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyChatCreate", null, "difyChat新增", null, true, false, 1, "dify:chat:create", ""); + Menu difyChatUpdate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyChatUpdate", null, "difyChat修改", null, true, false, 1, "dify:chat:update", ""); + Menu difyChatStop = new Menu(dify.getId(), Menu.Type.OPERATION, "difyChatStop", null, "difyChat停止", null, true, false, 1, "dify:chat:stop", ""); + Menu difyChatSend = new Menu(dify.getId(), Menu.Type.OPERATION, "difyChatSend", null, "difyChat发送", null, true, false, 1, "dify:chat:send", ""); + Menu difyChatDelete = new Menu(dify.getId(), Menu.Type.OPERATION, "difyChatDelete", null, "difyChat删除", null, true, false, 1, "dify:chat:delete", ""); + Menu difyServerQuery = new Menu(dify.getId(), Menu.Type.OPERATION, "difyServerQuery", null, "difyServer查询", null, true, false, 1, "dify:server:query", ""); + Menu difyServerCreate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyServerCreate", null, "difyServer新增", null, true, false, 1, "dify:server:create", ""); + Menu difyServerUpdate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyServerUpdate", null, "difyServer修改", null, true, false, 1, "dify:server:update", ""); + Menu difyServerInit = new Menu(dify.getId(), Menu.Type.OPERATION, "difyServerInit", null, "difyServer初始化", null, true, false, 1, "dify:server:init", ""); + Menu difyServerDelete = new Menu(dify.getId(), Menu.Type.OPERATION, "difyServerDelete", null, "difyServer删除", null, true, false, 1, "dify:server:delete", ""); + Menu difyDataSetQuery = new Menu(dify.getId(), Menu.Type.OPERATION, "difyDataSetQuery", null, "difyDataSet查询", null, true, false, 1, "dify:dataset:query", ""); + Menu difyDataSetCreate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyDataSetCreate", null, "difyDataSet新增", null, true, false, 1, "dify:dataset:create", ""); + Menu difyDataSetUpdate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyDataSetUpdate", null, "difyDataSet修改", null, true, false, 1, "dify:dataset:update", ""); + Menu difyDataSetRetrieve = new Menu(dify.getId(), Menu.Type.OPERATION, "difyDataSetRetrieve", null, "difyDataSet检索", null, true, false, 1, "dify:dataset:retrieve", ""); + Menu difyDataSetDelete = new Menu(dify.getId(), Menu.Type.OPERATION, "difyDataSetDelete", null, "difyDataSet删除", null, true, false, 1, "dify:dataset:delete", ""); + Menu difyWorkFlowQuery = new Menu(dify.getId(), Menu.Type.OPERATION, "difyWorkFlowQuery", null, "difyWorkFlow查询", null, true, false, 1, "dify:workflow:query", ""); + Menu difyWorkFlowCreate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyWorkFlowCreate", null, "difyWorkFlow新增", null, true, false, 1, "dify:workflow:create", ""); + Menu difyWorkFlowUpdate = new Menu(dify.getId(), Menu.Type.OPERATION, "difyWorkFlowUpdate", null, "difyWorkFlow修改", null, true, false, 1, "dify:workflow:update", ""); + Menu difyWorkFlowInfo = new Menu(dify.getId(), Menu.Type.OPERATION, "difyWorkFlowInfo", null, "difyWorkFlow信息", null, true, false, 1, "dify:workflow:info", ""); + Menu difyWorkFlowLog = new Menu(dify.getId(), Menu.Type.OPERATION, "difyWorkFlowLog", null, "difyWorkFlow日志", null, true, false, 1, "dify:workflow:log", ""); + Menu difyWorkFlowRun = new Menu(dify.getId(), Menu.Type.OPERATION, "difyWorkFlowRun", null, "difyWorkFlow运行", null, true, false, 1, "dify:workflow:run", ""); + Menu difyWorkFlowDelete = new Menu(dify.getId(), Menu.Type.OPERATION, "difyWorkFlowDelete", null, "difyWorkFlow删除", null, true, false, 1, "dify:workflow:delete", ""); menuService.saveBatch(List.of(roleCreate, roleDelete, roleUpdate, roleQuery, deptSave, deptUpdate, deptQuery, deptDelete, userSave, userUpdate, userQuery, userDelete, @@ -94,10 +101,10 @@ class MenuServiceImplTest { noticeCreate, noticeUpdate, noticeQuery, noticeDelete, bulletinCreate, bulletinUpdate, bulletinQuery, bulletinDelete, operationLogQuery, operationLogDelete, - difyChatQuery, difyChatCreate, difyChatUpdate, difyChatDelete, - difyServerQuery, difyServerCreate, difyServerUpdate, difyServerDelete, - difyDataSetQuery, difyDataSetCreate, difyDataSetUpdate, difyDataSetDelete, - difyWorkFlowQuery, difyWorkFlowCreate, difyWorkFlowUpdate, difyWorkFlowDelete + difyChatQuery, difyChatCreate, difyChatUpdate, difyChatDelete,difyChatSend,difyChatStop, + difyServerQuery, difyServerCreate, difyServerUpdate, difyServerDelete,difyServerInit, + difyDataSetQuery, difyDataSetCreate, difyDataSetUpdate, difyDataSetDelete,difyDataSetRetrieve, + difyWorkFlowQuery, difyWorkFlowCreate, difyWorkFlowUpdate, difyWorkFlowDelete, difyWorkFlowInfo,difyWorkFlowLog,difyWorkFlowRun )); }