@authhero/多层租房
对AuthHero的多租期支持有基于组织的访问控制,per租期数据库隔离,以及子域路由.
特征
- 🔐 以组织为基础的访问控制 - 控制租户通过JWT标志进入
org_id索赔 - 💾 数据库隔离 - 拥有D1、Turso或自定义提供者的租户数据库
- ⚙️ 设置继承 从主要租户到儿童租户的继承结构
- 🌐 子域运行 - 自动子域到租户分辨率
- 🔄 租户生命周期 - 自动提供和解除规定
- 🪝 可编解结构 - 将多租期特性与AuthHero基套件结合起来
- 📡 实体同步 - 自动同步资源服务器、角色和从控制平面到所有儿童租户的连接
安装
pnpm add authhero @authhero/multi-tenancy
* 同行依赖情况
@authhero/multi-tenancy 需求 authhero 作为同伴的依赖。 两个软件包都必须安装.
* :
文档
📚 完整文档数字 : https://docs.authhero.net/ 海关化/多租/
快速启动
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;
自定义
const { app } = initMultiTenant({
dataAdapter,
controlPlaneTenantId: "main",
sync: {
resourceServers: true,
roles: true,
connections: false, // Don't sync connections
},
defaultPermissions: ["tenant:admin", "tenant:read"],
});
高级设置
对于更多的控制,请使用下级API:
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());
关键概念
组织-十年模式
一个“主”租户的组织代表和控制儿童租户的进出。 每个组织向一名儿童租户绘制地图.
基于脚本的访问
访问通过 org_id 以JWT符号提出的索赔:
- 没有
org_id仅主要租户 - 与
org_id: 接触匹配的租户
静态认证
换租户,向不同的组织申请新的代币:
const token = await getAccessTokenSilently({
authorizationParams: {
organization: "tenant-id",
},
});
资源服务器同步
自动同步资源服务器(API)从主要租户到所有的儿童租户. 当你在主租户上创建,更新或删除一个资源服务器时,它会自动向所有其他租户传播.
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],
},
};
移徙指南
从遗产设置中移走继承
如果您正在使用被贬损的设置继承功能, 请迁移到新的运行时间倒计时 API :
前(已过期)
import {
withSettingsInheritance,
SettingsInheritanceConfig,
} from "@authhero/multi-tenancy";
const config: SettingsInheritanceConfig = {
controlPlaneTenantId: "main",
controlPlaneClientId: "main-client",
};
const adapters = withSettingsInheritance(baseAdapters, config);
后 (当前)
import {
withRuntimeFallback,
RuntimeFallbackConfig,
} from "@authhero/multi-tenancy";
const config: RuntimeFallbackConfig = {
controlPlaneTenantId: "main",
controlPlaneClientId: "main-client",
};
const adapters = withRuntimeFallback(baseAdapters, config);
改变了什么:
withSettingsInheritance→withRuntimeFallbackcreateSettingsInheritanceAdapter→createRuntimeFallbackAdapterSettingsInheritanceConfig→RuntimeFallbackConfig
功能依然相同——这纯粹是命名变化,以更好地反映设置在运行时被继承,而不在租户之间复制数据.
许可证
麻省理工学院