Concepts

多租户

Nebutra 如何实现租户隔离——跨栈每个层次的数据、认证和上下文。

什么是租户?

在 Nebutra 中,租户是一个组织——使用你的产品的公司、团队或工作空间。每个租户拥有独立的:

  • 成员(具有角色的用户)
  • 数据(通过租户 ID 隔离)
  • 计费套餐(FREE / PRO / ENTERPRISE)
  • API 密钥和设置
  • 功能标志覆盖

一个用户可以属于多个租户,无需重新登录即可切换。

租户生命周期

1. 用户注册 → 创建个人账户
2. 用户创建组织 → 提供租户
3. 租户获得唯一 org_id(如 org_2a8bXXXXXXXXX)
4. 租户所有者可以邀请成员(邮件邀请)
5. 成员获得角色:OWNER / ADMIN / MEMBER / VIEWER
6. 附加计费套餐:默认为 FREE
7. 每个租户生成 API 密钥(非每个用户)

租户上下文

Nebutra 使用 @nebutra/tenant 通过 Node.js AsyncLocalStorage 在整个调用栈中传播租户上下文。这意味着在请求上下文中运行的任何代码都可以访问当前租户,无需将其作为参数传递。

import { getCurrentTenant } from "@nebutra/tenant";

const tenant = getCurrentTenant();
// → {
//     tenantId: "org_2a8bXXX",
//     plan: "pro",
//     features: ["ai_workflows"],
//     rateLimits: { apiCalls: 100000 }
//   }

数据库隔离

默认情况下,Nebutra 使用带行级安全(RLS)的共享 Schema

每个存储租户特定数据的表都有 tenant_id 列。Prisma 客户端通过 PostgreSQL RLS 自动限定到当前租户:

import { withRls } from "@nebutra/tenant";
import { prisma } from "@/lib/db";

const db = withRls(prisma, tenant.tenantId);
const projects = await db.project.findMany(); // 仅返回此租户的项目

成员角色

每个租户成员拥有且仅拥有一个角色:

角色描述
OWNER完全控制、计费、可删除组织
ADMIN管理成员、设置、API 密钥
MEMBER核心产品访问权限
VIEWER只读访问权限

详见权限获取完整的权限范围矩阵。

相关文档

How is this guide?

目录