สมอง SML

คลังความรู้ / การตัดสินใจ (ADR)

#backend#adr#identity#multi-tenant

ADR-0003 Identity อยู่ในแต่ละผู้เช่า (per-tenant)

สถานะ: accepted แต่รายละเอียดเรื่อง "plain-text password" ใน ADR ล้าสมัยบางส่วน: โค้ดปัจจุบันรองรับทั้ง bcrypt และรหัสผ่าน legacy plaintext (domain/identity/identity.go:62-69). Login ตรวจกับ Main DB ของผู้เช่าเอง (sml_user_list ใน smlerpmain<code>) ไม่ใช้ตาราง users/user_tenant_access ของ control-plane (backend/docs/adr/0003-per-tenant-identity-not-control-plane.md:7).

ทำงานอย่างไร

  1. ผู้ใช้ส่ง provider (code ผู้เช่า) + dataGroup + username + password (tenantId เป็นชื่อ claim ใน JWT ไม่ใช่ชื่อ field ตอน login) → ระบบหา user ใน sml_user_list ด้วย user_code (postgres_repository.go:42, SQL บรรทัด 50-53).
  2. หา "บริษัท" ที่ผู้ใช้เข้าได้จาก sml_database_list_user_and_group (ผูกกับ DataGroup) (postgres_repository.go:132, SQL บรรทัด 138-145).
  3. ถ้ามีบริษัทเดียว ออก session ทันที; ถ้าหลายบริษัท ออก pre-auth token แล้วให้เรียก /auth/select-company (flow ที่ ADR คงไว้ แต่เปลี่ยนชื่อ Select Tenant เป็น Select Company) — ดู ขั้นตอน login / เลือกบริษัท / refresh / logout (Identity login flow).

ตัวเลือกที่ไม่เลือก

ใช้ตาราง control-plane users / user_tenant_access ตาม PLAN.md §4.5 เดิม — ต้อง migrate ข้อมูลผู้ใช้ของทุกผู้เช่าก่อน Login จะทำงานได้ (...0003...md:11).

ผลที่ตามมา

ที่มาในโค้ด

  • backend/internal/adapter/outbound/identity/postgres_repository.go:42 — FindByCode จาก sml_user_list.
  • backend/internal/adapter/outbound/identity/postgres_repository.go:132 — รายชื่อบริษัทจาก sml_database_list_user_and_group.
  • backend/internal/domain/identity/identity.go:62 — Authenticate รองรับ bcrypt + legacy plaintext.
  • backend/docs/adr/0003-per-tenant-identity-not-control-plane.md:7 — เหตุผลการกลับทิศทางจาก PLAN.md.

ดูเพิ่ม

ขั้นตอน login / เลือกบริษัท / refresh / logout (Identity login flow) · โมเดลผู้เช่าหลายราย: Tenant, Provider, Main DB, Company (Multi-tenant model) · JWT session token และการเพิกถอน (JWT + revocation store) · สารบัญ ADR ของ backend (Architecture Decision Records)