多租户开发(Multitenant Development)是一项面向多租户系统的专用技能,覆盖租户识别、数据隔离、租户专属配置与 RLS(行级安全)策略等核心环节。
用途 该技能用于在开发多租户功能时提供统一的操作规范与代码模式,帮助开发者在 API、中间件、数据库查询和资源加载等环节正确处理租户上下文,避免跨租户数据泄露。
主要能力
- 租户识别:在 API 与中间件中通过 getTenantFromRequest() 校验租户。
- 数据隔离:所有查询必须按 tenant_id 过滤,确保不同租户的数据互不可见。
- RLS 策略:确保行级安全策略包含租户校验,例如通过 current_setting('app.tenant_slug', true) 匹配 tenants 表中的 slug。
- 租户专属配置:在 public/tenants/{tenant_slug}/ 下配置租户专属资源。
- 资源路径处理:使用 getTenantAssetPath(tenant, assetPath, fallback) 生成资源 URL,包含按部署的缓存失效参数 ?v=。
关键文件
- src/lib/tenant/tenant-service.ts:主租户服务。
- src/lib/tenant/tenant-assets.ts:带缓存失效的资源 URL(Supabase 或本地)。
- src/middleware.ts:租户识别。
- src/components/TenantThemeStyles.tsx:租户样式。
- supabase/migrations/*:RLS 迁移。
- optimize-pintemas-assets-upload.js:将租户资源上传到 tenant-assets 存储桶。
使用方式 在 API 中实现租户隔离时,先调用 getTenantFromRequest(request) 获取租户,若不存在则返回 404;随后创建 Supabase 客户端,查询时使用 .eq('tenant_id', tenant.id) 过滤。RLS 策略示例:CREATE POLICY "tenant_isolation_products" ON products FOR ALL USING (tenant_id = (SELECT id FROM tenants WHERE slug = current_setting('app.tenant_slug', true)))。资源方面,使用 getTenantAssetPath() 生成带缓存失效的 URL,例如 getTenantAssetPath(tenant, 'logo.svg', '/images/logo/logo.svg'),主色可取自 tenant.primary_color 或默认值 '#ea5a17'。资源存放于 Supabase 的 tenant-assets 存储桶,路径为 tenants/{slug}/...,通过 node optimize-pintemas-assets-upload.js 上传。更改资源后需部署并清除 CDN 缓存(npm run cache:purge 或 Vercel → Settings → Caches),相关说明见 docs/CACHE_PURGE_ANTES_DEPLOY.md。
适用场景 适用于需要为多个租户提供隔离数据与个性化配置的 Web 应用开发,尤其是使用 Supabase 与 Next.js 的项目。
限制 资料未提供该技能的具体安装命令、收费方式、支持平台及性能指标等信息。