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:
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user