# 多租户系统 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` 头,中间件自动提取并注入到上下文中。 ## 使用方式 ### 请求示例 ```bash curl http://localhost:2222/api/v1/profile \ -H "Authorization: Bearer " \ -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 层自动添加租户过滤: ```go 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 中包含租户信息,服务端二次验证