SuperAPI AI 工具集

organization-best-practices

安全与审计

查看项目

更新于 10-16 11:33

技能介绍

本技能介绍如何使用 Better Auth 的 organization 插件搭建多租户组织体系,覆盖组织、成员、邀请、角色权限与团队管理。

一、用途 用于在应用中实现多租户组织结构:允许用户创建组织、邀请成员、定义自定义角色与权限、设置团队,并基于 Better Auth 实现 RBAC。

二、安装与初始化 服务端配置:在 betterAuth 中引入 organization 插件并配置。

import { betterAuth } from "better-auth"; import { organization } from "better-auth/plugins";

export const auth = betterAuth({ plugins: [ organization({ allowUserToCreateOrganization: true, organizationLimit: 5, // Max orgs per user membershipLimit: 100, // Max members per org }), ], });

客户端配置:

import { createAuthClient } from "better-auth/client"; import { organizationClient } from "better-auth/client/plugins";

export const authClient = createAuthClient({ plugins: [organizationClient()], });

迁移命令:npx @better-auth/cli migrate;迁移后检查数据库中是否存在 organization、member、invitation 表。

三、组织管理 创建组织时创建者自动获得 owner 角色,可设置 name、slug、logo、metadata。可通过 allowUserToCreateOrganization 与 organizationLimit 控制创建权限与数量,二者都支持传入用户属性(如邮箱是否验证、套餐等级)。管理员可在服务端为其他用户创建组织,需传 userId(owner),注意 userId 不能与 session headers 同时使用。活跃组织存储在会话中,用于限定后续 API 调用范围,通过 setActive({ organizationId }) 设置;未提供 organizationId 的许多端点会使用活跃组织,如 listMembers、listInvitations、inviteMember 等;getFullOrganization() 可获取含成员、邀请和团队的活跃组织。

四、成员管理 服务端使用 addMember({ userId, role, organizationId }) 添加成员;客户端添加成员应改用邀请系统。角色可传数组以分配多个角色。移除成员使用 removeMember({ memberIdOrEmail }),最后一个 owner 不可被移除。更新角色使用 updateMemberRole({ memberId, role })。membershipLimit 可传函数,根据组织 metadata 动态限制成员数。

五、邀请 通过 sendInvitationEmail 配置邀请邮件;inviteMember({ email, role }) 发送邀请;getInvitationURL 生成可分享的邀请链接(该端点不会调用 sendInvitationEmail,需自行处理投递)。可配置 invitationExpiresIn(默认 48 小时)、invitationLimit、cancelPendingInvitationsOnReInvite。

六、角色与权限 默认角色:owner(完全访问)、admin(管理成员/邀请/设置)、member(基础访问)。使用 hasPermission({ permission: "member:write" }) 校验权限;客户端静态 UI 渲染可用 checkRolePermission({ role, permissions }),动态访问控制使用 hasPermission 端点。

七、团队 启用 teams.enabled 后可通过 createTeam({ name }) 创建团队;使用 addTeamMember({ teamId, userId })(成员须先在组织中)和 removeTeamMember({ teamId, userId })(移除后仍留在组织);setActiveTeam({ teamId }) 设置活跃团队。可配置 maximumTeams、maximumMembersPerTeam、allowRemovingAllTeams。

八、动态访问控制 启用 dynamicAccessControl.enabled 后可用 createRole({ role, permission }) 创建自定义角色,updateRole({ roleId, permission }) 更新,deleteRole({ roleId }) 删除。预定义角色不可删除,已分配给成员的角色需先重新分配才能删除。

九、生命周期钩子与 Schema 自定义 可在 organization、member、invitation 上配置 beforeCreate、afterCreate、beforeDelete 等钩子执行自定义逻辑。Schema 可自定义表名(modelName)、字段名与附加字段(additionalFields)。

十、安全注意事项 最后一个 owner 不可被移除、不可退出组织,其 owner 角色不可被移除;移除当前 owner 前需先转移所有权。删除组织会清除成员、邀请、团队等所有关联数据,可用 disableOrganizationDeletion 禁用删除,或通过 beforeDelete 钩子实现软删除。邀请默认 48 小时过期,仅被邀请邮箱可接受,管理员可取消待处理邀请。

资料还提供了同时包含组织限制、slug、邀请与钩子配置的完整示例。