ทำไมเข้าเมนู/กดบันทึกแล้วขึ้น 403 ไม่มีสิทธิ์ และตั้งสิทธิ์เมนูให้ผู้ใช้อย่างไร
ตอบสั้น: ทุกคำขอไป /process/*, /query/exec, /query/execBatch, /blob/insert ผ่าน RequireRight ซึ่งโหลดสิทธิ์เมนูของผู้ใช้สดจาก Main Database แล้วเทียบกับ "สิทธิ์ที่ route ต้องการ" (อ่าน / เพิ่ม / แก้ / ลบ / Admin) ถ้าไม่ผ่านตอบ 403 ข้อความไทยตามชนิดสิทธิ์ ผู้ดูแลระบบตั้งสิทธิ์ที่จอ "กำหนดสิทธิ์กลุ่มใช้งาน" หรือ "กำหนดการเข้าถึงข้อมูล" (รายบุคคล)
รายละเอียด
อ่านข้อความ 403 ให้ออก (deniedMessages, middleware/permission.go:31):
| ข้อความขึ้นต้น | ชนิดสิทธิ์ที่ขาด |
|---|---|
| "ไม่มีสิทธิ์เรียกดูข้อมูล" | Read |
| "ไม่มีสิทธิ์เพิ่มข้อมูลใหม่" | Add |
| "ไม่มีสิทธิ์แก้ไขข้อมูล" | Edit |
| "ไม่มีสิทธิ์เพิ่มหรือแก้ไขข้อมูล" | Write (Add หรือ Edit อย่างใดอย่างหนึ่ง) |
| "หน้าจอนี้ไม่อนุญาตให้ลบข้อมูล" | Delete |
| "เฉพาะผู้ดูแลระบบ (Admin) เท่านั้น..." | Admin |
ใครได้สิทธิ์อะไร (Service.MenuRights, identity/service.go:174):
- username
superadmin(ไม่สนตัวพิมพ์) หรือlevel >= 9(webAdminLevel,:164) → ได้ทุกสิทธิ์รวม Admin - คนอื่นโหลดจาก DB ตามบริษัทใน token (
claims.DatabaseName) — ถ้าไม่มีแถวสิทธิ์เลย ได้ศูนย์ ไม่ใช่ได้ทั้งหมด Allows(permission.go:41): Admin ผ่านทุกอย่าง; Write = Add หรือ Edit; ผู้ที่ไม่ใช่ Admin จะผ่านสิทธิ์ Admin ไม่ได้เลย
สิทธิ์เก็บที่ไหน (UserRepository.MenuRights, postgres_repository.go:69): ตาราง sml_permissions_user (ราย user) และ sml_permissions_group (ราย group ผ่าน sml_user_and_group) ใน Main DB คอลัมน์ image_file เป็น blob ของรายการเมนู (JSON หรือ XML ของ C# เดิม) แถวถูกกรองด้วย database_name ของบริษัทที่ล็อกอิน (แถวที่ตรงบริษัทมาก่อนแถวว่าง) และผลรวมของ user + group คือ OR กัน
route ต้องการสิทธิ์อะไร:
/process: ตารางrouteRights(process/permission.go:23) คีย์"กลุ่ม/action"→ read/write/del/admin และRequiredRight(:57) ปรับตาม body เช่นtrans/saveดูisNewแยก Add/Edit/query/exec|execBatchและ/blob/insert:QueryRequiredRight(:138) แปลงคำกริยา SQL เป็น Add/Edit/Delete- route ที่ไม่อยู่ใน
routeRightsต้องเป็น Admin (return admin,:132) — สาเหตุที่พบบ่อยเมื่อเพิ่ม action ใหม่แล้วผู้ใช้ทั่วไปได้ 403 (Process engine (/process) เรียก action อย่างไร และเพิ่ม action ใหม่ต้องแก้ที่ไหนบ้าง)
ตั้งสิทธิ์ให้ผู้ใช้ (ผู้ดูแลระบบ):
- จัดผู้ใช้เข้ากลุ่มที่จอ "จัดกลุ่มผู้ใช้" (
sml_group_list,sml_user_and_group) - จอ "กำหนดสิทธิ์กลุ่มใช้งาน" ติ๊ก อ่าน/เพิ่ม/แก้ไข/ลบ รายเมนูของกลุ่ม หรือจอ "กำหนดการเข้าถึงข้อมูล" ตั้งรายคน แล้วกด "บันทึกสิทธิ์" (จัดกลุ่มผู้ใช้ ข้อความระบบ และสิทธิ์รายเมนู (UserGroupsScreen, SystemTextScreen, GroupPermissionScreen, DataPermissionScreen))
- จอเรียก
GET/PUT /api/v1/admin/menu-permissions(router.go:234-235) ซึ่งเขียนimage_fileของ user หรือ group - ให้ผู้ใช้ล็อกอินเข้าใหม่เลือกบริษัทเดิม — สิทธิ์โหลดสดทุกคำขอ จึงมีผลทันที แต่
levelใน token เปลี่ยนเมื่อออก token ใหม่เท่านั้น (ทำไมถูกเด้งออกจากระบบ / ขึ้น "หมดเวลาใช้งาน" (token หมดอายุ, idle 30 นาที, logout) ทำงานอย่างไร)
ข้อควรระวัง
- ถ้าผ่านด่านสิทธิ์เมนูแล้วยังได้ 403 ตารางเงิน/สต็อก/GL ไม่ใช่ปัญหาสิทธิ์เมนู แต่เป็นนโยบายล็อกเขียน (ทำไมเขียนข้อมูลผ่าน /query/exec ไม่ได้ (error 403 ตารางเงิน/สต็อก/GL))
- คำสั่ง
ALTER TABLE ... ADD COLUMN IF NOT EXISTS database_nameรันทุกครั้งที่โหลดสิทธิ์ (postgres_repository.go:74-75) และผลถูกทิ้ง ถ้า DB user ไม่มีสิทธิ์ ALTER จะเงียบ - สิทธิ์คลัง/ชั้นเก็บเป็นกลไกแยก ดู จำกัดคลัง/ที่เก็บที่ผู้ใช้เลือกได้ (perm_wh_shelf) ตั้งอย่างไร และทำไมผู้ใช้เห็นคลังไม่ครบ
ดูเพิ่ม
- สิทธิ์เมนูและ middleware RequireRight (Menu rights / permission)
- การตรวจสิทธิ์เมนูของ route process (Process route rights)
- บทเรียนระบบสิทธิ์เมนู (Permission & Menu Rights)
- จัดกลุ่มผู้ใช้ ข้อความระบบ และสิทธิ์รายเมนู (UserGroupsScreen, SystemTextScreen, GroupPermissionScreen, DataPermissionScreen)
- ทำไมเขียนข้อมูลผ่าน /query/exec ไม่ได้ (error 403 ตารางเงิน/สต็อก/GL)
- จำกัดคลัง/ที่เก็บที่ผู้ใช้เลือกได้ (perm_wh_shelf) ตั้งอย่างไร และทำไมผู้ใช้เห็นคลังไม่ครบ
ที่มาในโค้ด
backend/internal/adapter/inbound/http/middleware/permission.go:31deniedMessagesข้อความ 403 ภาษาไทยต่อชนิดสิทธิ์backend/internal/adapter/inbound/http/middleware/permission.go:41Allowsและ:62RequireRightbackend/internal/application/identity/service.go:174MenuRights(superadmin / level >= 9 / โหลดจาก DB)backend/internal/adapter/outbound/identity/postgres_repository.go:69SQL สิทธิ์ user + group กรองdatabase_namebackend/internal/adapter/outbound/identity/menu_rights.go:48DecodeMenuRights(JSON หรือ XML เดิม)backend/internal/adapter/inbound/http/process/permission.go:23routeRights,:57RequiredRight(default admin บรรทัด 132),:138QueryRequiredRightbackend/internal/adapter/inbound/http/router.go:234GET/PUT /menu-permissionsของ admin