feat(dify): 更新权限控制并增加新功能

- 在 AppEntity 和 WorkflowData 中添加 createId 和 deptId 字段,用于记录创建者和部门信息
- 更新 MenuServiceImplTest 中的菜单权限,增加新的操作权限并调整现有权限- 修改 V1ChatController 中的 sendChatMessage 方法权限,从 query 改为 send
- 新增 V1ChatController 中的 stopMessagesStream 方法权限,添加 stop 权限
- 更新 V1DatasetController 中的 retrieve 方法权限,从 query 改为 retrieve
- 修改V1ServerController 中的 initAppApiKey 和 initDatasetApiKey 方法权限,从 create 改为 init
- 在 V1WorkflowController 中的 list 方法添加数据权限控制
This commit is contained in:
zhuangtianxiang 2025-05-09 13:11:26 +08:00
parent 1dfc8ea017
commit eddc46e40d
7 changed files with 50 additions and 24 deletions

View File

@ -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();

View File

@ -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);
}

View File

@ -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<AppsResponseVO> 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<ApiKeyResponseVO> 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<DatasetApiKeyResponseVO> initDatasetApiKey() {
return difyServer.initDatasetApiKey();
}
@ -107,6 +109,7 @@ public class V1ServerController {
*/
@GetMapping("/apps/enabled")
@PreAuthorize("hasAuthority('dify:server:query')")
@DataPermission
public List<AppEntity> getEnableApps() {
LambdaQueryWrapper<AppEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AppEntity::isEnabled, true);

View File

@ -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<WorkflowData> list(@PathVariable String appId){
return difyWorkflowService.list(new QueryWrapper<WorkflowData>().eq("app_id",appId));
}

View File

@ -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<AppEntity> children = null;
@TableField(value = "create_id", fill = FieldFill.INSERT)
private Long createId;
@TableField(value = "dept_id", fill = FieldFill.INSERT)
private Long deptId;
}

View File

@ -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;
}

View File

@ -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
));
}