@authhero/multi-tenancy

中文文档
15.6.0发布于 2026/11/05AGPL-3.0-onlyTypeScriptESM + CJS构建来源已验证近 30 天下载 1757

Multi-tenancy support for AuthHero with organization-based access control and per-tenant database isolation

原始使用文档
文档目录14 节
  1. Features
  2. Installation
  3. Documentation
  4. Quick Start
  5. Customization
  6. Advanced Setup
  7. Key Concepts
  8. Organization-Tenant Model
  9. Token-Based Access
  10. Silent Authentication
  11. Resource Server Synchronization
  12. Migration Guide
  13. Migrating from Legacy Settings Inheritance
  14. License

@authhero/multi-tenancy

Multi-tenancy support for AuthHero with organization-based access control, per-tenant database isolation, and subdomain routing.

Features

  • 🔐 Organization-based Access Control - Control tenant access via JWT tokens with org_id claims
  • 💾 Database Isolation - Per-tenant databases with D1, Turso, or custom providers
  • ⚙️ Settings Inheritance - Inherit configuration from main tenant to child tenants
  • 🌐 Subdomain Routing - Automatic subdomain-to-tenant resolution
  • 🔄 Tenant Lifecycle - Automated provisioning and deprovisioning
  • 🪝 Composable Architecture - Combine multi-tenancy features with the base AuthHero package
  • 📡 Entity Sync - Automatically sync resource servers, roles, and connections from control plane to all child tenants

Installation

pnpm add authhero @authhero/multi-tenancy

::: tip Peer Dependency @authhero/multi-tenancy requires authhero as a peer dependency. Both packages must be installed. :::

Documentation

📚 Full documentation: https://docs.authhero.net/customization/multi-tenancy/

Quick Start

import { initMultiTenant } from "@authhero/multi-tenancy";
import createAdapters from "@authhero/kysely-adapter";

const dataAdapter = createAdapters(db);

const { app } = initMultiTenant({
  dataAdapter,
  // That's it! Everything else has sensible defaults:
  // - controlPlaneTenantId: "control_plane"
  // - Resource servers, roles, and connections sync enabled
  // - Tenants API mounted at /tenants
  // - Protected synced entities middleware applied
});

export default app;

Customization

const { app } = initMultiTenant({
  dataAdapter,
  controlPlaneTenantId: "main",
  sync: {
    resourceServers: true,
    roles: true,
    connections: false, // Don't sync connections
  },
  defaultPermissions: ["tenant:admin", "tenant:read"],
});

Advanced Setup

For more control, use the lower-level APIs:

import { init, fetchAll } from "authhero";
import {
  createSyncHooks,
  createTenantsOpenAPIRouter,
  createProtectSyncedMiddleware,
} from "@authhero/multi-tenancy";

const { entityHooks, tenantHooks } = createSyncHooks({
  controlPlaneTenantId: "control_plane",
  getChildTenantIds: async () => {
    /* ... */
  },
  getAdapters: async () => dataAdapter,
  getControlPlaneAdapters: async () => dataAdapter,
});

const tenantsRouter = createTenantsOpenAPIRouter(
  { accessControl: { controlPlaneTenantId: "control_plane" } },
  { tenants: tenantHooks },
);

const { app } = init({
  dataAdapter,
  entityHooks,
  managementApiExtensions: [{ path: "/tenants", router: tenantsRouter }],
});

app.use("/api/v2/*", createProtectSyncedMiddleware());

Key Concepts

Organization-Tenant Model

Organizations on a "main" tenant represent and control access to child tenants. Each organization maps to one child tenant.

Token-Based Access

Access is controlled via the org_id claim in JWT tokens:

  • No org_id: Main tenant only
  • With org_id: Access to matching tenant

Silent Authentication

Switch tenants by requesting a new token with a different organization:

const token = await getAccessTokenSilently({
  authorizationParams: {
    organization: "tenant-id",
  },
});

Resource Server Synchronization

Automatically sync resource servers (APIs) from the main tenant to all child tenants. When you create, update, or delete a resource server on the main tenant, it's automatically propagated to all other tenants.

import { createResourceServerSyncHooks } from "@authhero/multi-tenancy";

const resourceServerHooks = createResourceServerSyncHooks({
  mainTenantId: "main",
  getChildTenantIds: async () => {
    // Return all tenant IDs except the main tenant
    const { tenants } = await adapters.tenants.list();
    return tenants.filter((t) => t.id !== "main").map((t) => t.id);
  },
  getAdapters: async (tenantId) => {
    // Return adapters for the target tenant
    return createAdaptersForTenant(tenantId);
  },
  // Optional: filter which resource servers to sync
  shouldSync: (resourceServer) => {
    // Only sync resource servers that start with "api:"
    return resourceServer.identifier.startsWith("api:");
  },
});

// Use with AuthHero config
const config: AuthHeroConfig = {
  dataAdapter,
  entityHooks: {
    resourceServers: [resourceServerHooks],
  },
};

Migration Guide

Migrating from Legacy Settings Inheritance

If you're using the deprecated settings inheritance functions, migrate to the new runtime fallback API:

Before (Deprecated)

import {
  withSettingsInheritance,
  SettingsInheritanceConfig,
} from "@authhero/multi-tenancy";

const config: SettingsInheritanceConfig = {
  controlPlaneTenantId: "main",
  controlPlaneClientId: "main-client",
};

const adapters = withSettingsInheritance(baseAdapters, config);

After (Current)

import {
  withRuntimeFallback,
  RuntimeFallbackConfig,
} from "@authhero/multi-tenancy";

const config: RuntimeFallbackConfig = {
  controlPlaneTenantId: "main",
  controlPlaneClientId: "main-client",
};

const adapters = withRuntimeFallback(baseAdapters, config);

What changed:

  • withSettingsInheritance → withRuntimeFallback
  • createSettingsInheritanceAdapter → createRuntimeFallbackAdapter
  • SettingsInheritanceConfig → RuntimeFallbackConfig

The functionality remains identical - this is purely a naming change to better reflect that settings are inherited at runtime without copying data between tenants.

License

MIT

版本与发布记录

@authhero/multi-tenancy 共发布 92 个版本,首次发布于 2025/12/05;过去 12 个月发布了 92 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
15.6.0latest2026/11/054 天前
15.5.02026/11/055 天前
15.4.22026/11/045 天前
15.4.12026/11/036 天前
15.4.02026/10/2911 天前
15.3.02026/10/2614 天前

关于 @authhero/multi-tenancy 的常见问题

@authhero/multi-tenancy 是什么?

Multi-tenancy support for AuthHero with organization-based access control and per-tenant database isolation

如何安装 @authhero/multi-tenancy?

在项目目录运行 npm install @authhero/multi-tenancy,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:hono(^4.7.0)、authhero(^9.27.0)、@hono/zod-openapi(^1.4.0)、@authhero/adapter-interfaces(^4.25.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@authhero/multi-tenancy 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@authhero/multi-tenancy 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@authhero/multi-tenancy 可以商用吗?

@authhero/multi-tenancy 使用 AGPL-3.0-only 许可。最严格的 Copyleft:除分发外,通过网络向用户提供基于它的服务也需要开源对应源码。闭源 SaaS 使用前务必评估。以上为概括,不构成法律意见,请以许可原文为准。

@authhero/multi-tenancy 的下载量有多少?

根据 npm 官方下载统计,@authhero/multi-tenancy 在 2026/10/07 – 2026/11/05 这 30 天内被下载 1,757 次,日均约 59 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@authhero/multi-tenancy 还在维护吗?

最新版本 15.6.0 发布于 2026/11/05(4 天前);至今共发布 92 个版本,其中过去 12 个月发布了 92 个;首次发布于 2025/12/05。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。