多租户专题
Yi.Mini 的多租户能力以宿主机为管理入口。宿主机负责租户、租户套餐、菜单范围和租户数据库初始化;租户侧只使用分配后的菜单和角色权限。
角色边界
- 平台超级管理员角色码为
superadmin,只存在于宿主机。 - 租户管理员角色码为
admin,只存在于租户侧。 - 租户管理、租户套餐属于平台治理能力,只允许
superadmin操作。 - 菜单管理允许
superadmin和admin访问,但租户侧不应拥有平台级菜单。
不要在租户数据库中创建 superadmin 角色。租户能看到哪些菜单,由租户套餐和租户内角色授权共同决定。
租户套餐
租户套餐用于定义租户可用的菜单范围。入口为:
系统管理 -> 租户套餐新增或编辑套餐时,需要填写:
| 字段 | 说明 |
|---|---|
| 套餐名称 | 套餐显示名称 |
| 关联菜单 | 该套餐允许同步到租户的菜单范围 |
| 备注 | 套餐说明 |
| 状态 | 是否启用 |
关联菜单来自宿主机菜单树。新增套餐时,前端调用 tenantPackageMenuTreeSelect(EMPTY_GUID) 获取可选菜单;编辑套餐时,使用套餐 ID 回显已选菜单。
默认套餐由后端种子数据创建,名称为 标准套餐。默认套餐包含除以下菜单外的基础菜单和权限:
- 租户管理
- 租户套餐
- 接口文档
这几个菜单不应下放给租户,否则租户会获得平台治理入口。
租户创建
入口为:
系统管理 -> 租户管理新增租户时需要选择租户套餐,并配置租户名称、数据库连接信息、联系人、账号数量等基础信息。租户创建后只是登记租户元数据,不等于租户数据库已经完成初始化。
启用 SaaS 多租户后,后端种子数据会创建默认租户:
| 项 | 默认值 |
|---|---|
| 租户名称 | testTenant |
| 默认套餐 | 标准套餐 |
| 联系人 | 租户管理员 |
| 账号数量 | -1,表示不限制 |
SQLite 场景下,默认租户连接串会使用 tenant-{租户名}.db。
租户初始化
租户列表提供“初始化”操作。初始化会完成以下动作:
- 切换到目标租户上下文。
- 执行租户数据库 CodeFirst,创建或更新表结构。
- 执行租户侧数据种子。
- 创建或更新租户管理员账号。
- 根据租户绑定的套餐同步菜单。
- 将套餐菜单授权给租户管理员角色。
初始化接口为:
PUT /tenant/init/{id}请求体:
{
"username": "admin",
"password": "123456",
"isForce": false
}如果租户数据库已有数据,且 isForce 为 false,接口会返回:
{
"needForce": true
}页面会二次确认是否强制初始化。强制初始化前需要确认数据风险,避免误清理或覆盖租户已有业务数据。
套餐同步
当租户绑定套餐后,初始化会自动同步套餐菜单。也可以通过后端同步接口主动同步:
POST /tenant/sync-package?tenantId={tenantId}&packageId={packageId}同步规则:
- 先在租户上下文执行 CodeFirst,确保租户数据库结构存在。
- 根据套餐关联的宿主菜单,自动补齐父级菜单。
- 租户管理员
admin会获得套餐内菜单权限。 - 其他租户角色会裁剪掉不在套餐范围内的菜单权限。
如果套餐没有配置任何菜单,或宿主菜单已不存在,同步会失败并返回业务错误。
登录与租户上下文
登录页会加载租户下拉数据。选择非默认租户后,前端会在请求头中写入:
__tenant: {tenantId}后端通过 __tenant 识别当前租户上下文。默认租户或宿主机上下文不会附加该请求头。
切换租户后,前端会重新加载用户信息、角色、权限和路由。普通租户用户最终可见菜单来自:
租户套餐菜单范围
+ 租户内角色菜单授权
+ /api/account/router 返回的路由树租户级文件存储
租户可以配置自己的文件存储 Provider 和阿里云 OSS 参数。租户未配置时,文件模块会回退到应用默认的 BlobStoring 配置;租户配置后,上传、下载 URL 解析和删除会按当前租户配置执行。
OSS 配置入口位于文件管理页面的“OSS 存储设置”。具体字段、优先级和本地文件迁移 OSS 规则见 基础能力配置。
推荐操作顺序
首次启用多租户时,建议按以下顺序操作:
- 确认 SaaS 多租户配置已启用。
- 使用
superadmin登录宿主机。 - 检查默认租户套餐,确认不包含平台治理菜单。
- 创建或编辑租户,并绑定租户套餐。
- 在租户列表点击“初始化”,填写租户管理员账号和密码。
- 使用租户账号登录,验证菜单和按钮权限是否符合套餐范围。
常见问题
租户只显示部分菜单
先检查租户绑定的套餐是否包含目标菜单,再检查租户内角色是否授权该菜单。套餐控制上限,角色授权控制实际可见范围。
租户管理员看不到新增菜单
新增宿主菜单后,需要把菜单加入租户套餐,并重新同步套餐到租户。只改宿主菜单不会自动出现在已有租户数据库中。
租户套餐里看不到租户管理
这是预期行为。默认套餐会排除“租户管理”“租户套餐”“接口文档”,避免租户获得平台治理能力。
初始化提示需要强制初始化
说明目标租户数据库已经存在数据。确认该租户数据可以覆盖或重建后,再执行强制初始化。