---
title: "Vendo SaaS 集成：租户隔离与审批边界"
canonical: https://wavect.io/zh/blog/vendo-saas-tenant-isolation/
language: zh
description: "用双租户、角色撤销、审批和重启测试规划 Vendo 集成，明确哪些生产责任仍由 SaaS 团队承担。"
image: "https://wavect.io/img/blog/headers/header_vendo-saas-tenant-isolation.png"
---

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

3 分钟 阅读 · 2026年10月8日 最近审核 2026年10月8日

[**下一篇**](/zh/blog/enterprise-mcp-authorization-architecture/)

# Vendo SaaS 集成：租户隔离与审批边界

要点速览

Vendo 能为 SaaS 增加用户构建的功能，但身份、租户访问和动作权限仍要由宿主强制执行。先上线一个只读功能，再用两个租户证明审批与重启行为，最后才开放写入。

**证据范围：**文档核对日期为2026年10月8日。本文是基于研究的实施指南。下文试点是建议方案，我们没有实际运行这些供应商评测，也没有测量其性能。

## 加入 Vendo 后，SaaS 团队仍负责什么？

你的后端仍决定登录用户能读取或修改哪些记录。生成界面、沙箱和审批卡片不能替代 API 授权。先选择一个工具已强制执行租户范围的客户看板，独立验证边界后，再扩展到动作。

本文讨论的是 `vendo.run` 的 Vendo，即 [runvendo 官方仓库](https://github.com/runvendo/vendo) 维护的定制层，可在现有产品中添加智能体功能与微应用。其他同名公司不属于本文范围。

## 身份与租户访问应该如何处理？

[Vendo 身份认证文档](https://docs.vendo.run/howto/auth) 使用宿主已有身份，建议采用不可变 subject。其无认证示例把所有访客归为同一个演示用户，不能用于多租户生产集成。

让 Vendo 和宿主路由共享可信的服务端会话解析。组织成员关系来自后端，并在每个访问业务数据的工具中检查。模型提供的组织 ID 不是权限证明。属于两个组织的用户，也需要明确的当前组织边界。

## 双租户试点应证明什么？

创建合成组织 A、B，每个组织各有管理员和只读成员。两者拥有本地编号相同、内部标识不同的发票。提出一个“逾期发票”视图和提醒动作。以下是验收目标，不是已观察到的 Vendo 结果。

| 尝试 | 必须满足的结果 | 独立检查 |
| --- | --- | --- |
| A 请求 B 的发票 ID | 拒绝且不泄露字段 | 宿主 API 响应与访问日志 |
| A 切换当前组织 | 只显示新授权上下文 | 重新查询并打开保存的应用 |
| 只读成员发送提醒 | 无明确权限就阻止 | 投递台账不变 |
| 管理员审批后被撤销角色 | 执行前重新检查权限 | 撤销后没有外部发送 |
| 两个 worker 恢复同一已审批动作 | 只有一次逻辑副作用 | 持久操作键与投递台账 |
| 进程重启 | 合法状态保留，过期授权不复活 | 存储内容与动作重放 |

既通过生成 UI，也直接对宿主工具运行读取测试。隐藏按钮不是访问控制测试。

## Vendo 会在每次写入前请求批准吗？

不会。 [审批指南](https://docs.vendo.run/howto/approvals) 说明默认读取和写入执行，破坏性及未分类调用请求批准。应为发送消息、变更计费数据等敏感写入制定显式规则。业务关键写入即使没有被技术分类为破坏性，也可能需要审批。

该指南区分应用内恢复与 MCP：外部智能体在审批后，需要在同一 MCP 会话重新调用。如果客户使用两种入口，都要测试。审批应绑定具体动作，执行时重新检查权限，不能绕过授权。

## 哪些状态必须跨重启保留？

[持久化文档](https://docs.vendo.run/production/persistence) 介绍 Vendo Cloud 对线程、应用、授权、审批、审计和运行的存储。持久化能力不能证明宿主写入只执行一次。维护业务操作台账，记录租户、操作者、已审批参数、操作键及核实后的结果。

外部结果不明确时，重试前先查询目标系统。如果提醒已投递，但进程在保存响应前退出，创建新操作可能重复发送。试点应覆盖外部副作用发生后、宿主确认前的崩溃。

## vendo doctor 通过就能上线吗？

不能。 [生产检查清单](https://docs.vendo.run/production/deploying) 明确指出 doctor 读取源代码和环境，不调用已部署应用。用它发现接线问题，再在 staging 测试身份、流式响应、已验证 webhook、审批和重启。Cloud 填充部分基础设施槽位，但多个安全与请求边界仍由宿主负责。

## Vendo 适合什么场景？

当客户需要不同视图或范围明确的流程，而宿主 API 能可靠授权时，适合试点。如果只有固定任务、不需要用户构建应用，自建 copilot 可能更简单。扩展前明确工具 schema、保存功能和事故恢复的维护责任。带上一个功能及权限矩阵， [规划 SaaS 智能体集成](/zh/contact/) 。

[下载建议试点协议（JSON）。其中包含验收用例与空结果字段，不是供应商实测结果。](/downloads/vendo-saas-tenant-isolation-pilot.json)

## 相关实施指南

[企业级 MCP 授权架构：一份多租户参考设计](/zh/blog/enterprise-mcp-authorization-architecture/). [SaaS 集成 AgentMail：租户隔离与重复邮件恢复](/zh/blog/agentmail-saas-duplicate-sends-recovery/).

## 已核对的来源

- [runvendo/vendo](https://github.com/runvendo/vendo)
- [Vendo: Auth](https://docs.vendo.run/howto/auth)
- [Vendo: Approvals](https://docs.vendo.run/howto/approvals)
- [Vendo: Persistence](https://docs.vendo.run/production/persistence)
- [Vendo: Deploying](https://docs.vendo.run/production/deploying)

**独立性与商标声明:** 本页由 Wavect 发布，Wavect 自身也是服务商，因此我们对本页存在商业利益。我们与本页提及的其他公司没有关联，未获得其背书，也不是其合作伙伴；所有第三方公司名称、品牌与商标均归各自所有者所有。关于其他服务商的陈述来自公开可查的来源，主要是其自己发布的页面，以本页标注的核查日期为准，此后可能已经发生变化。做决定前请自行直接核实。本页依据我们所知的情况撰写，并力求保持客观。如果你认为其中有不准确或不公平之处，请写信告诉我们，我们会更正： [office@wavect.io](mailto:office@wavect.io)

架构与平台

## 继续浏览此集群

对长期交付产生影响的框架、平台与系统设计选择。

[从核心文章开始**智慧城市软件架构：MQTT、LoRaWAN、Kubernetes 与 Terraform**](/zh/blog/smart-city-architecture-best-practices-2026/)

- [GitButler 并行 AI 智能体：多个分支，一个运行中的应用](/zh/blog/gitbutler-parallel-ai-agents-one-workspace/)
- [SaaS 集成 AgentMail：租户隔离与重复邮件恢复](/zh/blog/agentmail-saas-duplicate-sends-recovery/)
- [AI 编程时代的软件护城河：谁来维护你构建的系统？](/zh/blog/ai-coding-software-moat-operations/)
- [Shopify B2B 订单审批：原生功能、应用还是定制买方门户？](/zh/blog/shopify-b2b-order-approval-workflow/)
- [Shopify–ERP 退货与退款：标准连接器何时不够用？](/zh/blog/shopify-erp-returns-refunds-integration/)

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

3 分钟 阅读 · 2026年10月8日 最近审核 2026年10月8日

[**下一篇**](/zh/blog/enterprise-mcp-authorization-architecture/)

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/zh/blog/vendo-saas-tenant-isolation/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-10-08",
      "inLanguage": "zh",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-10-08",
      "url": "https://wavect.io/zh/blog/vendo-saas-tenant-isolation/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "Vendo 能为 SaaS 增加用户构建的功能，但身份、租户访问和动作权限仍要由宿主强制执行。先上线一个只读功能，再用两个租户证明审批与重启行为，最后才开放写入。",
  "articleBody": " 博客概览/交付与 QA/架构与平台 Vendo SaaS 集成：租户隔离与审批边界 要点速览 Vendo 能为 SaaS 增加用户构建的功能，但身份、租户访问和动作权限仍要由宿主强制执行。先上线一个只读功能，再用两个租户证明审批与重启行为，最后才开放写入。 证据范围：文档核对日期为2026年10月8日。本文是基于研究的实施指南。下文试点是建议方案，我们没有实际运行这些供应商评测，也没有测量其性能。 加入 Vendo 后，SaaS 团队仍负责什么？ 你的后端仍决定登录用户能读取或修改哪些记录。生成界面、沙箱和审批卡片不能替代 API 授权。先选择一个工具已强制执行租户范围的客户看板，独立验证边界后，再扩展到动作。 本文讨论的是 vendo.run 的 Vendo，即runvendo 官方仓库维护的定制层，可在现有产品中添加智能体功能与微应用。其他同名公司不属于本文范围。 身份与租户访问应该如何处理？ Vendo 身份认证文档使用宿主已有身份，建议采用不可变 subject。其无认证示例把所有访客归为同一个演示用户，不能用于多租户生产集成。 让 Vendo 和宿主路由共享可信的服务端会话解析。组织成员关系来自后端，并在每个访问业务数据的工具中检查。模型提供的组织 ID 不是权限证明。属于两个组织的用户，也需要明确的当前组织边界。 双租户试点应证明什么？ 创建合成组织 A、B，每个组织各有管理员和只读成员。两者拥有本地编号相同、内部标识不同的发票。提出一个“逾期发票”视图和提醒动作。以下是验收目标，不是已观察到的 Vendo 结果。 尝试必须满足的结果独立检查 A 请求 B 的发票 ID拒绝且不泄露字段宿主 API 响应与访问日志A 切换当前组织只显示新授权上下文重新查询并打开保存的应用只读成员发送提醒无明确权限就阻止投递台账不变管理员审批后被撤销角色执行前重新检查权限撤销后没有外部发送两个 worker 恢复同一已审批动作只有一次逻辑副作用持久操作键与投递台账进程重启合法状态保留，过期授权不复活存储内容与动作重放 既通过生成 UI，也直接对宿主工具运行读取测试。隐藏按钮不是访问控制测试。 Vendo 会在每次写入前请求批准吗？ 不会。审批指南说明默认读取和写入执行，破坏性及未分类调用请求批准。应为发送消息、变更计费数据等敏感写入制定显式规则。业务关键写入即使没有被技术分类为破坏性，也可能需要审批。 该指南区分应用内恢复与 MCP：外部智能体在审批后，需要在同一 MCP 会话重新调用。如果客户使用两种入口，都要测试。审批应绑定具体动作，执行时重新检查权限，不能绕过授权。 哪些状态必须跨重启保留？ 持久化文档介绍 Vendo Cloud 对线程、应用、授权、审批、审计和运行的存储。持久化能力不能证明宿主写入只执行一次。维护业务操作台账，记录租户、操作者、已审批参数、操作键及核实后的结果。 外部结果不明确时，重试前先查询目标系统。如果提醒已投递，但进程在保存响应前退出，创建新操作可能重复发送。试点应覆盖外部副作用发生后、宿主确认前的崩溃。 vendo doctor 通过就能上线吗？ 不能。生产检查清单明确指出 doctor 读取源代码和环境，不调用已部署应用。用它发现接线问题，再在 staging 测试身份、流式响应、已验证 webhook、审批和重启。Cloud 填充部分基础设施槽位，但多个安全与请求边界仍由宿主负责。 Vendo 适合什么场景？ 当客户需要不同视图或范围明确的流程，而宿主 API 能可靠授权时，适合试点。如果只有固定任务、不需要用户构建应用，自建 copilot 可能更简单。扩展前明确工具 schema、保存功能和事故恢复的维护责任。带上一个功能及权限矩阵，规划 SaaS 智能体集成。 下载建议试点协议（JSON）。其中包含验收用例与空结果字段，不是供应商实测结果。 相关实施指南 企业级 MCP 授权架构：一份多租户参考设计. SaaS 集成 AgentMail：租户隔离与重复邮件恢复. 已核对的来源 runvendo/vendoVendo: AuthVendo: ApprovalsVendo: PersistenceVendo: Deploying 独立性与商标声明: 本页由 Wavect 发布，Wavect 自身也是服务商，因此我们对本页存在商业利益。我们与本页提及的其他公司没有关联，未获得其背书，也不是其合作伙伴；所有第三方公司名称、品牌与商标均归各自所有者所有。关于其他服务商的陈述来自公开可查的来源，主要是其自己发布的页面，以本页标注的核查日期为准，此后可能已经发生变化。做决定前请自行直接核实。本页依据我们所知的情况撰写，并力求保持客观。如果你认为其中有不准确或不公平之处，请写信告诉我们，我们会更正： office@wavect.io 架构与平台 继续浏览此集群 对长期交付产生影响的框架、平台与系统设计选择。 从核心文章开始智慧城市软件架构：MQTT、LoRaWAN、Kubernetes 与 Terraform GitButler 并行 AI 智能体：多个分支，一个运行中的应用 SaaS 集成 AgentMail：租户隔离与重复邮件恢复 AI 编程时代的软件护城河：谁来维护你构建的系统？ Shopify B2B 订单审批：原生功能、应用还是定制买方门户？ Shopify–ERP 退货与退款：标准连接器何时不够用？ 集群中的上一篇GitButler 并行 AI 智能体：多个分支，一个运行中的应用集群中的下一篇SaaS 集成 AgentMail：租户隔离与重复邮件恢复 相关服务路径： 软件 QA 看看生产环境中的应用: Polity 先做决定: 上线前的软件质量保障清单 只收重要内容 关注与你相关的内容 每当我们发布新文章，你会收到一封简短邮件。你可以关注整个博客，也可以只选感兴趣的主题。 Company 电子邮箱 你希望接收哪些内容？ 完整的 Wavect 博客接收六个主题下的每一篇新文章。 仅接收所选主题请在下方选择一个或多个分类。 选择主题 AI 与智能体 产品与 MVP 交付与 QA 领导力与团队 商业与监管 Web3 与隐私 我希望接收所选的 Wavect 博客邮件，并已阅读 隐私信息。我可以随时退订。 获取下一篇笔记→ 免费、双重确认、不使用跟踪像素。 ",
  "articleSection": "工程实践",
  "author": {
    "@id": "https://wavect.io/team/kevin-riedl/#person",
    "@type": "Person",
    "name": "Kevin Riedl",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796365",
      "https://www.linkedin.com/in/wsdt",
      "https://github.com/wsdt"
    ],
    "url": "https://wavect.io/team/kevin-riedl/"
  },
  "citation": [
    {
      "@type": "WebPage",
      "name": "runvendo 官方仓库",
      "url": "https://github.com/runvendo/vendo"
    },
    {
      "@type": "WebPage",
      "name": "Vendo 身份认证文档",
      "url": "https://docs.vendo.run/howto/auth"
    },
    {
      "@type": "WebPage",
      "name": "审批指南",
      "url": "https://docs.vendo.run/howto/approvals"
    },
    {
      "@type": "WebPage",
      "name": "持久化文档",
      "url": "https://docs.vendo.run/production/persistence"
    },
    {
      "@type": "WebPage",
      "name": "生产检查清单",
      "url": "https://docs.vendo.run/production/deploying"
    }
  ],
  "dateModified": "2026-10-08",
  "datePublished": "2026-10-08",
  "description": "Vendo 能为 SaaS 增加用户构建的功能，但身份、租户访问和动作权限仍要由宿主强制执行。先上线一个只读功能，再用两个租户证明审批与重启行为，最后才开放写入。",
  "headline": "Vendo SaaS 集成：租户隔离与审批边界",
  "image": "https://wavect.io/img/blog/headers/header_vendo-saas-tenant-isolation.svg",
  "inLanguage": "zh",
  "keywords": "工程实践, AI智能体",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/zh/blog/vendo-saas-tenant-isolation/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/zh/blog/vendo-saas-tenant-isolation/",
  "wordCount": 165
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/",
      "name": "首页",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/overview/",
      "name": "博客概览",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/topics/delivery-qa/",
      "name": "交付与 QA",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/clusters/architecture-platforms/",
      "name": "架构与平台",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/vendo-saas-tenant-isolation/",
      "name": "Vendo SaaS 集成：租户隔离与审批边界",
      "position": 5
    }
  ]
}
```
