云
10 小时以前 b6c0dc29218252bf207440446276b53d66ba35e1
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/agent/SystemAgentImportBridgeController.java
@@ -65,10 +65,22 @@
        return success(bridgeService.bindAttachment(sessionId, request.getBlobId()));
    }
    @DeleteMapping("/attachments/{attachmentId}")
    public CommonResult<Boolean> deleteAttachment(
            @RequestHeader(value = "X-Agent-Service-Token", required = false) String serviceToken,
            @RequestHeader(value = "X-Agent-Delegation-Token", required = false) String delegationToken,
            @RequestHeader(value = "X-Agent-Task-Id", required = false) String taskId,
            @PathVariable Long attachmentId) {
        bridgeGuard.requireAny(serviceToken, delegationToken, taskId, "attachment.delete", null, attachmentId);
        bridgeService.deleteImportAttachment(attachmentId);
        return success(true);
    }
    @PostMapping("/authorize")
    @PreAuthorize(IMPORT_PERMISSIONS_EXPR)
    public CommonResult<Map<String, String>> authorize(
            @RequestHeader(value = "X-Agent-Service-Token", required = false) String serviceToken,
            @RequestHeader(value = "X-Agent-Delegation-Token", required = false) String delegationToken,
            @RequestHeader(value = "X-Agent-Task-Id", required = false) String taskId,
            @Valid @RequestBody AuthorizeRequest request) {
        if (!ACTIONS.contains(request.getAction())) {
            throw new AgentBridgeException(HttpStatus.FORBIDDEN, "ACTION_FORBIDDEN", "不支持的智能体操作");
@@ -77,26 +89,30 @@
        if (request.getAction().startsWith("conversation.")) {
            String permission = MODULE_PERMISSIONS.get(request.getResource());
            principal = permission == null
                    ? bridgeGuard.requireAny(serviceToken)
                    : bridgeGuard.require(serviceToken, permission);
                    ? bridgeGuard.requireAny(serviceToken, delegationToken, taskId, request.getAction(),
                    request.getResource(), null)
                    : bridgeGuard.require(serviceToken, delegationToken, taskId, request.getAction(), permission,
                    request.getResource(), null);
        } else {
            principal = bridgeGuard.require(serviceToken, SystemAgentBridgeGuard.PERMISSION_ITEM_IMPORT);
            principal = bridgeGuard.require(serviceToken, delegationToken, taskId, request.getAction(),
                    SystemAgentBridgeGuard.PERMISSION_ITEM_IMPORT, "mdm.item",
                    requiresAttachmentOwnership(request.getAction()) ? parseId(request.getResource()) : null);
        }
        if (requiresAttachmentOwnership(request.getAction())) {
            bridgeService.requireOwnedAttachmentRef(parseId(request.getResource()));
        }
        // read/review/read_receipt 的任务 UUID 所有权由 Python checkpoint 作用域核验;本端重查当前按钮权限。
        return success(Map.of("user_id", String.valueOf(principal.userId()),
                "tenant_id", String.valueOf(principal.tenantId()),
                "policy_revision", principal.policyRevision()));
    }
    @GetMapping("/attachments/{attachmentId}")
    @PreAuthorize(IMPORT_PERMISSIONS_EXPR)
    public ResponseEntity<FileSystemResource> downloadAttachment(
            @RequestHeader(value = "X-Agent-Service-Token", required = false) String serviceToken,
            @RequestHeader(value = "X-Agent-Delegation-Token", required = false) String delegationToken,
            @RequestHeader(value = "X-Agent-Task-Id", required = false) String taskId,
            @PathVariable Long attachmentId) {
        bridgeGuard.requireAny(serviceToken);
        bridgeGuard.requireAny(serviceToken, delegationToken, taskId, "attachment.read", null, attachmentId);
        SystemAgentAttachmentRef ref = bridgeService.requireOwnedAttachmentRef(attachmentId);
        return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM)
                .contentLength(ref.byteSize())