乐达
  • StoreManage项目的租户策略

    进销存
    1 2 21 1

    Z
    35
    0

    让我总结一下StoreManage项目的租户策略:

    🔍 StoreManage 租户解析策略分析

    当前状态:写死的调试租户

    1. TenantMiddleware 中间件
      • 位置:Middlewares/TenantMiddleware.cs
      • 策略:从配置文件读取固定租户ID
      • 配置:AppSettings:DebugTenantId = "5FF26670-D017-59EE-EE32-3A0DA8CB9375"
      • 目的:仅供开发调试使用,省去每次手动切换租户的麻烦
    public async Task InvokeAsync(HttpContext context, ICurrentTenant currentTenant)
    {
        // 获取默认租户 ID
        var tenantId = _configuration["AppSettings:DebugTenantId"];
        if (string.IsNullOrEmpty(tenantId))
            await _next(context);
    
        // 如果请求中包含租户 ID,则使用请求中的租户 ID
        if (Guid.TryParse(tenantId, out Guid parsedTenantId))
        {
            if (currentTenant.Id == parsedTenantId)
                await _next(context);
            else
            {
                using (currentTenant.Change(parsedTenantId))
                {
                    await _next(context);
                }
            }
        }
    

    ABP 默认支持的租户解析方式

    从代码中看到他们使用了 ABP 的默认解析器:

    • Cookie: CookieTenantResolveContributor
    • QueryString: QueryStringTenantResolveContributor

    没有配置 基于域名的解析器!


    💡 应该使用的租户解析策略

    推荐方案:根据子域名解析

    ABP 框架支持多种租户解析方式,常见的有:

    解析方式 示例 适用场景
    子域名 tenant1.loda.net.cn ✅ SaaS应用(推荐)
    顶级域名 tenant1.com 需要独立域名的高端客户
    QueryString ?__tenant=tenant1 开发测试
    Header X-Tenant: tenant1 API调用
    Cookie 自动保存 Web应用

    如何配置域名租户解析

    在 Module 的 ConfigureServices 中添加:

    Configure<AbpTenantResolveOptions>(options =>
    {
        // 1. 子域名解析(推荐)
        options.TenantResolvers.Insert(0, new DomainTenantResolveContributor());
        
        // 2. Header解析(用于API)
        options.TenantResolvers.Add(new HeaderTenantResolveContributor());
        
        // 3. Cookie解析(用于Web)
        options.TenantResolvers.Add(new CookieTenantResolveContributor());
    });
    

    域名映射配置

    需要在数据库的 AbpTenants 表或 SaasTenants 表中配置:

    • TenantName: ganaju(租户名称)
    • DomainNames: ganaju.loda.net.cn(域名列表)

    🎯 总结

    目前状态

    • ❌ 写死租户ID 5FF26670-D017-59EE-EE32-3A0DA8CB9375(柑橘)
    • ✅ 仅用于开发调试
    • ❌ 生产环境不适用

    应该实现

    • ✅ 基于子域名的租户解析
      • 柑橘:ganaju.loda.net.cn
      • 租户2:tenant2.loda.net.cn
    • ✅ 配置 DomainTenantResolveContributor
    • ✅ 在数据库中维护租户与域名的映射关系

    需要我帮你实现域名租户解析功能吗?

  • Z
    35
    0

    让我查看生产环境的配置和租户解析设置:

    ❌ 遇到文件访问错误

    我在尝试查找生产环境配置文件时遇到了路径问题。我想查看 appsettings.production.jsonappsettings.staging.json 来了解生产环境如何配置租户解析,但这些文件似乎不存在或路径有误。


    📌 当前发现的关键信息

    基于我已经看到的代码,生产环境存在严重问题

    问题:TenantMiddleware 在所有环境都启用了!

    app.UseMiddleware<TenantMiddleware>(); // ⚠️ 没有环境判断
    

    这个中间件注释说 "正式环境不需要",但实际上在所有模块中都无条件启用了:

    • Products.HttpApi.Host (第207行)
    • Products.Blazor.Server.Host (第357行)
    • Orders、Inventories、Basic、Report 等所有模块

    结果

    生产环境也在用写死的租户ID:

    • 如果 appsettings.production.json 中配置了 DebugTenantId,则所有用户都访问同一个租户
    • 如果没配置,中间件直接 return,才会使用 ABP 默认的租户解析(Cookie/QueryString)

    🤔 如何继续?

    请告诉我:

    1. 你们生产环境的域名是什么? 比如 ganaju.loda.net.cn
    2. 想要我帮你:
      • A) 查看实际生产环境配置(需要正确的配置文件路径)
      • B) 直接实现基于域名的租户解析方案
      • C) 修复 TenantMiddleware,只在开发环境启用
        我建议选 B+C:实现域名租户解析,并修复中间件只在开发环境启用。