Guides

多租户指南

创建租户、管理成员、切换组织和隔离数据的分步指南。

创建组织

新用户注册后会被提示创建组织。也可以通过代码创建:

const org = await nebutra.orgs.create({
  name: "Acme 公司",
  slug: "acme",
  ownerId: userId,
});

邀请成员

await nebutra.members.invite({
  orgId: "org_123",
  email: "[email protected]",
  role: "MEMBER",  // OWNER | ADMIN | MEMBER | VIEWER
});

Alice 将收到包含邀请链接的事务性邮件。接受邀请会创建其成员关系并触发 member.joined Webhook 事件。

更改成员角色

await nebutra.members.updateRole({
  orgId: "org_123",
  userId: "user_456",
  role: "ADMIN",
});

无法更改 OWNER 的角色,除非先转让所有权。必须始终至少有一个 OWNER

移除成员

await nebutra.members.remove({
  orgId: "org_123",
  userId: "user_456",
});

数据隔离实践

使用 withRls 时,所有数据查询自动限定到当前租户:

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

export async function getProjects() {
  const tenant = getCurrentTenant();
  const db = withRls(prisma, tenant.tenantId);

  // 此查询仅返回当前租户的项目
  // WHERE tenant_id = '...' 子句由 PostgreSQL RLS 注入
  return db.project.findMany({
    orderBy: { createdAt: "desc" },
  });
}

租户级 API 密钥

API 密钥属于租户,而非用户。在设置 → API 密钥中创建:

const key = await nebutra.apiKeys.create({
  orgId: "org_123",
  name: "生产 CI",
  scopes: ["project:read", "project:create"],
  expiresAt: new Date("2027-01-01"),
});
// key.secret 只显示一次——请安全存储

相关文档

How is this guide?

目录