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).
ทำงานอย่างไร
- ผู้ใช้ส่ง
provider(code ผู้เช่า) +dataGroup+username+password(tenantIdเป็นชื่อ claim ใน JWT ไม่ใช่ชื่อ field ตอน login) → ระบบหา user ในsml_user_listด้วยuser_code(postgres_repository.go:42, SQL บรรทัด 50-53). - หา "บริษัท" ที่ผู้ใช้เข้าได้จาก
sml_database_list_user_and_group(ผูกกับ DataGroup) (postgres_repository.go:132, SQL บรรทัด 138-145). - ถ้ามีบริษัทเดียว ออก 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).
ผลที่ตามมา
- คนเดียวกันที่ login 2 ผู้เช่า อาจมี credential ต่างกัน ไม่มีบัญชีรวม (
...0003...md:14). - ประเด็นที่ ADR ปล่อยค้างไว้: ที่เก็บ refresh token และ audit login (
...0003...md:14). โค้ดปัจจุบันตอบเรื่องแรกด้วยไฟล์ JSON revocation (ADR-0004 การเพิกถอน session ตอน logout (RevocationStore)); ส่วน audit schema ดู ไฟล์ migration และการสร้างตารางตอนรัน (Migrations / runtime DDL) (ยังไม่ยืนยันว่ามีโค้ดเขียน audit ตอน login). - Access token พก
levelของผู้ใช้ ใช้ตัดสินสิทธิ์เขียน (นโยบายล็อกการเขียนผ่าน Query Gateway (Query write policy / lockdown)).
ที่มาในโค้ด
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)