mengstack-website/guide/multi-tenancy.md
SoftUnis ecb29e0aa4 初始化 MengStack 官方网站仓库
包含 VitePress 文档站完整源码及全新自定义首页设计:
- 自定义首页组件 (Home.vue):Hero + 终端动效 + 核心能力 + 架构展示 + 快速开始 + CTA
- 自定义 Layout.vue:首页/文档页布局切换
- 金铜色品牌主题样式
- 完整文档页面(指南、API、更新日志、演示、社区)
- SEO 配置(sitemap、robots、meta 标签)
2026-10-02 23:37:25 +08:00

1.8 KiB
Raw Blame History

多租户系统

MengStack 内置多租户支持,通过 X-Tenant-ID 请求头实现租户隔离。

工作原理

┌─────────┐                    ┌─────────┐
│ Tenant A │──X-Tenant-ID: A──→│         │──WHERE tenant_id='A'──→ DB
├─────────┤                    │  MengStack │
│ Tenant B │──X-Tenant-ID: B──→│  Server   │──WHERE tenant_id='B'──→ DB
├─────────┤                    │         │
│ Tenant C │──X-Tenant-ID: C──→│         │──WHERE tenant_id='C'──→ DB
└─────────┘                    └─────────┘

每个请求必须携带 X-Tenant-ID 头,中间件自动提取并注入到上下文中。

使用方式

请求示例

curl http://localhost:2222/api/v1/profile \
  -H "Authorization: Bearer <token>" \
  -H "X-Tenant-ID: tenant-001"

中间件处理

认证中间件自动验证:

  1. 解析 JWT Token 获取用户信息
  2. 验证 X-Tenant-ID 头是否存在
  3. 将 user_id 和 tenant_id 注入到 Gin Context
  4. 下游 Handler 可直接使用 c.GetUint("user_id") 和 c.GetString("tenant_id")

数据层隔离

Repository 层自动添加租户过滤:

func (r *GormUserRepository) FindByTenant(ctx context.Context, tenantID string) ([]*domain.User, error) {
    var users []*domain.User
    err := r.db.Where("tenant_id = ?", tenantID).Find(&users).Error
    return users, err
}

租户注册

租户管理是独立模块(M4 里程碑),当前版本通过手动在数据库创建租户记录。

安全考虑

  • 中间件强制校验 X-Tenant-ID,缺失则返回 401
  • 数据查询自动过滤,防止跨租户数据泄露
  • JWT Token 中包含租户信息,服务端二次验证