包含 VitePress 文档站完整源码及全新自定义首页设计: - 自定义首页组件 (Home.vue):Hero + 终端动效 + 核心能力 + 架构展示 + 快速开始 + CTA - 自定义 Layout.vue:首页/文档页布局切换 - 金铜色品牌主题样式 - 完整文档页面(指南、API、更新日志、演示、社区) - SEO 配置(sitemap、robots、meta 标签)
1.8 KiB
1.8 KiB
多租户系统
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"
中间件处理
认证中间件自动验证:
- 解析 JWT Token 获取用户信息
- 验证
X-Tenant-ID头是否存在 - 将
user_id和tenant_id注入到 Gin Context - 下游 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 中包含租户信息,服务端二次验证