chore(tenant): 租户域名改为默认关闭(客户决定先不做)—— 能力保留,关得干净

客户:先不做多租户了。

处理:fill.tenant-domain.enabled 默认 true → **false**,代码全部保留。
理由:
  · 这个能力是隔离的:关掉后 TenantDomainResolver 一律返回 null,
    登录走老路径、AuthInterceptor 那段校验根本不触发 —— 不影响任何既有行为
  · 它已经验过(§一·二十五 16/16),删掉等于扔掉一份验过、将来要用的东西
  · 要真用上它,前提是有正式域名 + 泛域名解析 + 泛域名证书;这些没定之前
    开它只会让人以为"域名能区分单位了",实际并不能。等定了改一个配置 + 重启即可。

「关得干净」是本轮的验收点:E2E 改成**两种模式都能跑**,按当前模式选断言。
现在跑的是关闭态这一节(6 条):
  ✓ t1.localhost + 不填租户码 → 40012(域名不参与判断)
  ✓ 同一域名 + 填租户码 → 照样能登;主域名 + 租户码 → 照样能登
  ✓ 主域名 + 不填租户码 → 仍是 40012(跨单位重名的原行为)
  ✓ 关掉之后不引入任何新校验:带 t1 的 token 访问 t14 域名照常通过
脚本自己探测模式(免租户码登录成功=开、40012=关),所以开着时跑它会跑那 16 条,
不会因为模式不对而假绿。

将来开启:填 base → 配泛域名解析+证书 → XT_TENANT_DOMAIN_ENABLED=true → 重启 → 跑 E2E。
两条硬约束不变:微信授权回调域名只能配一个(回调统一落主域名再按 scene 跳回)、
小程序域名固定白名单(小程序端永远靠 scene)。

随之暂缓:§一·二十五 的三条待拍板(正式域名 / 手填租户码 / 小程序确认)现在都不用追了;
PRD 与 03-接口设计的补文档也等真要做时再写(现在写进去只会多一条"设计了但没启用")。

全量 666 条断言、0 失败(租户域名 16 → 6,因为跑的是关闭态那节)。
This commit is contained in:
2026-09-29 21:42:00 +08:00
parent 5b2f2c109d
commit e6cd1049d4
3 changed files with 138 additions and 6 deletions
+65 -1
View File
@@ -94,7 +94,7 @@ def login(host: str, tenant_code: str | None = None, account: str = "admin",
return call("POST", "/api/v1/auth/login", host, body=body)
def main() -> int:
def run_on() -> int:
ap = argparse.ArgumentParser(description="租户域名 E2E")
ap.add_argument("--password", default="Admin@123")
args = ap.parse_args()
@@ -174,5 +174,69 @@ def main() -> int:
return 1 if FAILED else 0
def detect_mode() -> str:
"""
探测后端有没有启用租户域名:用 t1.localhost 且不填租户码试一次登录。
为什么要探测而不是写死:客户 2026-09-29 决定"先不做",默认已关;
但这个能力保留着(填个域名就能开)。脚本两种模式都要能跑,
而且**两种模式的断言是不同的** —— 关闭态要验的是"行为与从前完全一致"。
"""
r = login("t1.localhost", None)
if r.get("code") == 0:
return "ON"
if r.get("code") == 40012:
return "OFF"
raise SystemExit(f" ✗ 探测失败(既不是 0 也不是 40012):{r}")
def run_off() -> int:
"""
关闭态(当前默认):验"关掉之后,行为与从前**完全一致**"。
这一节看着简单,但它是"先不做"这件事的验收 ——
关一个功能键,最怕的是关不干净(悄悄留下一点新行为)。
"""
print("=" * 76)
print("租户域名 E2E —— 当前是**关闭态**(客户先不做,能力保留)")
print("=" * 76)
print("\n[关闭态] 域名不再提供租户身份,老路径完全不变")
a = login("t1.localhost", None)
check("t1.localhost + 不填租户码 → 40012(域名不参与判断)",
a.get("code") == 40012, f"{a}")
b = login("t1.localhost", "demo")
check("同一域名 + 填租户码 → 照样能登(老路径不受影响)", b.get("code") == 0, f"{b}")
c = login("localhost", "demo")
check("主域名 + 租户码 → 照样能登", c.get("code") == 0, f"{c}")
d = login("localhost", None)
check("主域名 + 不填租户码 → 仍是 40012(跨单位重名的原行为)",
d.get("code") == 40012, f"{d}")
token = (b.get("data") or {}).get("token")
e = call("GET", "/api/v1/users?pageNum=1&pageSize=1", "t14.localhost", token)
check("关掉之后**不引入任何新校验**:带着 t1 的 token 访问 t14 域名照常通过",
e.get("code") == 0,
f"{e}(这是关闭前的既有行为;开启态下会被 403 拒掉,见 run_on)")
ok("要验开启态:以 XT_TENANT_DOMAIN_ENABLED=true 重启后端,再跑本脚本")
print()
print("=" * 76)
print(f"通过 {len(PASSED)} 失败 {len(FAILED)} 共 {len(PASSED) + len(FAILED)}")
if FAILED:
for n, det in FAILED:
print(f" · {n}\n {det}")
print("=" * 76)
return 1 if FAILED else 0
def main() -> int:
mode = detect_mode()
if mode == "ON":
return run_on()
return run_off()
if __name__ == "__main__":
raise SystemExit(main())