Appearance
多租户
多租户是「一套系统服务多个客户/组织」的能力。WB-Admin 在前端这一侧做了三件事:选租户、带租户上下文、按租户隔离展示。
开关
ini
# .env.development
VITE_ENABLE_TENANT=true关闭后:登录页不显示租户下拉、侧栏隐藏「租户管理」、请求头不带 X-Tenant-Id。
租户上下文如何传递
登录时选择租户 → tenantStore.setTenant(id) → 写 localStorage + cookie → 请求拦截器每次自动带上:
ts
// src/utils/request.ts
config.headers['X-Tenant-Id'] = getTenantId()业务代码不需要、也不应该在每次请求里手动传租户 ID。 漏传一次就是一个越权风险,交给拦截器统一处理。
store
ts
const tenantStore = useTenantStore()
tenantStore.enabled // 是否启用
tenantStore.tenants // 租户列表
tenantStore.currentId // 当前租户
tenantStore.setTenant(id)切换租户
「租户管理」页可以切换当前租户。切换会清空用户态并要求重新拉取路由与字典,避免拿到上一个租户的缓存:
ts
await userStore.logout()
await tenantStore.setTenant(id)
permStore.resetRoute()
router.replace('/login')超管视角
租户列表里有一条 000000(平台方/默认租户),拥有跨租户查看能力。页面上的租户筛选器对普通租户隐藏。
后端要配合什么
- 所有业务表带
tenant_id字段。 - 从
X-Tenant-Id解析租户并自动拼到查询条件(MyBatis 拦截器 / JPA Filter)。 000000视为平台方,跳过租户过滤。
前端只负责「带得上、切得动、看得对」,真正的隔离必须在后端做。前端的租户隔离只是体验,不是安全边界。