กลับไปหน้าบทความ
#RBAC#การจัดการสิทธิ์#เว็บไซต์#Backend#ความปลอดภัย

คู่มือทำระบบจัดการสิทธิ์ผู้ใช้แบบ RBAC ในเว็บไซต์ทีละขั้น

RBAC เป็นแนวทางจัดการสิทธิ์ผู้ใช้ที่ช่วยให้ระบบดูแลง่าย ปรับสิทธิ์ได้เป็นระบบ และลดความผิดพลาดในการดูแลเว็บไซต์ บทความนี้สรุปวิธีออกแบบโครงสร้าง สิทธิ์ ฐานข้อมูล Middleware และแนวทางใช้งานจริงแบบทีละขั้น

28 มกราคม 2569อ่านประมาณ 3 นาที

แชร์บทความ

คู่มือทำระบบจัดการสิทธิ์ผู้ใช้แบบ RBAC ในเว็บไซต์ทีละขั้น

คู่มือทำระบบจัดการสิทธิ์ผู้ใช้แบบ RBAC ในเว็บไซต์ทีละขั้น

การทำระบบจัดการสิทธิ์ผู้ใช้หรือ RBAC (Role-Based Access Control) ไม่จำเป็นต้องซับซ้อนเสมอไป หากวางโครงสร้างให้ดีตั้งแต่ต้น ระบบจะดูแลง่าย ขยายต่อได้ในอนาคต และช่วยลดความผิดพลาดในการกำหนดสิทธิ์ของผู้ใช้ได้มาก

แนวคิดหลักของ RBAC คือการแยกสิทธิ์ออกเป็น 3 ส่วนสำคัญ ได้แก่

  • Role คือกลุ่มงานหรือบทบาท เช่น Admin, Editor, Support
  • Permission คือสิทธิ์ย่อย เช่น user.read, user.write, post.publish
  • User คือผู้ใช้งานที่สามารถมี Role ได้หนึ่งหรือหลายบทบาท

เมื่อ User ได้รับ Role แล้ว ระบบจะอ้างอิง Permission ผ่าน Role อีกชั้นหนึ่ง ข้อดีคือหากต้องการเปลี่ยนสิทธิ์ของคนทั้งทีม ก็สามารถแก้ที่ Role เพียงจุดเดียว

1. ออกแบบ Permission ให้สื่อความหมายและสม่ำเสมอ

จุดเริ่มต้นที่สำคัญของ RBAC คือการตั้งชื่อ Permission ให้ชัดเจน โดยแนะนำให้ใช้รูปแบบ คำกริยา.ทรัพยากร เช่น

  • user.read
  • user.create
  • user.update
  • user.delete
  • role.read
  • role.update
  • post.read
  • post.publish
  • billing.read

หลักการตั้งชื่อที่ดีคือ

  • ใช้รูปแบบเดียวกันทั้งระบบ
  • ไม่ยาวเกินไป
  • อ่านแล้วเข้าใจทันทีว่าหมายถึงอะไร

หากระบบมีขนาดใหญ่ขึ้น อาจเพิ่ม prefix ตามโมดูล เช่น crm.lead.read เพื่อช่วยจัดระเบียบสิทธิ์ให้ชัดเจนขึ้น

2. วางโครงสร้างฐานข้อมูลให้เรียบง่ายแต่รองรับการใช้งานจริง

สำหรับเว็บไซต์ส่วนใหญ่ โครงสร้างฐานข้อมูลพื้นฐานที่ครอบคลุมการใช้งานได้ดีประกอบด้วยตารางดังนี้

  • users
  • roles
  • permissions
  • user_roles (user_id, role_id)
  • role_permissions (role_id, permission_id)
  • audit_logs

โครงสร้างนี้เพียงพอสำหรับเว็บจำนวนมาก และช่วยให้ระบบไม่รกตั้งแต่เริ่มต้น หากในอนาคตต้องการความยืดหยุ่นมากขึ้น ค่อยพิจารณาเพิ่มตาราง user_permissions เพื่อกำหนดสิทธิ์รายบุคคลเพิ่มเติม

อย่างไรก็ตาม ในช่วงเริ่มต้นควรให้ Role เป็นศูนย์กลาง ก่อน เพราะจะดูแลง่ายกว่าและลดความซับซ้อนของระบบ

3. สร้างแหล่งความจริงของสิทธิ์ด้วย Permission Cache

หากทุกคำขอของระบบต้องไป join ตารางหลายชั้นเพื่อตรวจสอบสิทธิ์ อาจส่งผลให้ระบบช้าลงเมื่อข้อมูลเริ่มมีขนาดใหญ่ ดังนั้นจึงควรมี Permission Cache หรือแหล่งความจริงของสิทธิ์ที่พร้อมใช้งาน

แนวทางที่นิยมคือ

  • เมื่อผู้ใช้ login ให้ระบบรวบรวม permission ทั้งหมดของผู้ใช้
  • เก็บชุด permission นี้ไว้ใน session, JWT claim หรือ cache

ข้อควรพิจารณาเพิ่มเติม

  • ถ้าใช้ JWT ควรเก็บเป็น array แบบสั้น หรือเก็บเป็น hash/version
  • ถ้าใช้ session หรือ Redis จะสะดวกกว่าเวลาต้องเปลี่ยนสิทธิ์แล้วสั่ง invalidate

อีกจุดที่สำคัญมากคือการใส่ค่า permission_version ไว้ใน user เพื่อบังคับให้สิทธิ์รีเฟรชเมื่อมีการเปลี่ยน role หรือ permission วิธีนี้ช่วยลดปัญหาสิทธิ์ค้างได้ดีมาก

4. แยก Authentication และ Authorization ด้วย Middleware

ระบบที่ดีควรแยกให้ชัดเจนระหว่าง

  • Authentication: ตรวจสอบว่าผู้ใช้ login แล้วหรือไม่
  • Authorization: ตรวจสอบว่าผู้ใช้มีสิทธิ์เข้าถึงฟีเจอร์นั้นหรือไม่

การทำ Middleware ให้เรียกใช้ง่ายและอ่านเข้าใจได้จะช่วยให้โค้ดดูแลต่อได้ง่าย เช่น

  • requirePermission("post.publish")
  • requireAnyPermission(["user.update", "role.update"])
  • requireRole("Admin")

สิ่งที่ควรหลีกเลี่ยงคือการผูก logic ด้านสิทธิ์เข้ากับชื่อ route มากเกินไป เพราะเมื่อมีการ refactor route ในอนาคต อาจทำให้ระบบพังหรือเกิดช่องโหว่ได้ง่าย

5. ทำหน้า Admin เท่าที่จำเป็นก่อน

ระบบจัดการ Role และ Permission ไม่จำเป็นต้องเริ่มจากหน้าจอขนาดใหญ่หรือซับซ้อนมาก ในช่วงแรก แค่มี 4 หน้าหลักก็เพียงพอแล้ว ได้แก่

  1. Users: แสดงรายชื่อผู้ใช้และ Role ที่ได้รับ
  2. Roles: ใช้สร้างหรือแก้ไขชื่อ Role
  3. Role Permissions: ใช้เลือก Permission ให้แต่ละ Role ในรูปแบบ checklist
  4. Audit Logs: ใช้ดูประวัติการเปลี่ยนสิทธิ์และเหตุการณ์สำคัญ

แนวทางนี้ช่วยให้ทีมเริ่มใช้งานได้เร็วและค่อยขยายฟีเจอร์เพิ่มเติมภายหลัง

6. ใช้ UX ที่ช่วยลดความผิดพลาดของผู้ดูแลระบบ

หน้าจอสำหรับจัดการสิทธิ์มักเป็นจุดที่เกิดความผิดพลาดได้ง่าย จึงควรออกแบบ UX ให้ช่วยลดความสับสน เช่น

  • จัด Permission เป็นหมวด เช่น User, Content, Billing
  • มีระบบ search/filter เพื่อค้นหาสิทธิ์ได้เร็ว
  • มีปุ่ม Select all ในแต่ละหมวด
  • มีฟังก์ชัน Copy permissions จาก role อื่น
  • มี preview สรุปว่า Role นี้ทำอะไรได้บ้างก่อนกดบันทึก
  • แสดงผลกระทบ เช่นมีผู้ใช้กี่คนที่กำลังใช้ Role นี้อยู่

รายละเอียดเล็กน้อยเหล่านี้ช่วยลดความผิดพลาดในงานของแอดมินได้มากกว่าที่คิด

7. ยึดหลัก Default Deny และ Least Privilege

หลักความปลอดภัยที่สำคัญมากของ RBAC คือ

  • Default Deny: ถ้าไม่อนุญาตไว้ ให้ถือว่าไม่มีสิทธิ์
  • Least Privilege: ให้สิทธิ์เท่าที่จำเป็นต่อการทำงานเท่านั้น

แนวปฏิบัติที่ควรใช้ เช่น

  • ผู้ใช้ใหม่ควรได้ Role ที่มีสิทธิ์น้อยที่สุดก่อน
  • ไม่ควรแจก Role กว้างมาก เช่น SuperUser ให้ทุกคนเพียงเพราะสะดวก
  • ควรสร้าง Role ตามลักษณะงานจริง เช่น Support อ่านข้อมูลได้อย่างเดียว หรือ Editor แก้ไขคอนเทนต์ได้

แนวคิดนี้ช่วยลดความเสี่ยงจากการให้สิทธิ์เกินจำเป็น และทำให้ระบบปลอดภัยขึ้นอย่างมาก

8. ทำ Audit Log ให้ตอบคำถามได้จริง

Audit Log ที่ดีไม่ใช่แค่มีไว้เก็บข้อมูล แต่ต้องช่วยตอบได้ว่า ใครทำอะไร เมื่อไหร่ และเพราะอะไร

ข้อมูลที่ควรเก็บ ได้แก่

  • actor_user_id ว่าใครเป็นผู้ดำเนินการ
  • action เช่น role.assign, role.permission.update
  • target_type/target_id เช่น user:123 หรือ role:5
  • before/after เป็น snapshot หรือ diff แบบย่อ
  • ip_address
  • user_agent
  • created_at

อีกจุดที่มีประโยชน์มากคือการเก็บ reason หรือเหตุผลของการเปลี่ยนสิทธิ์ เช่น อ้างอิง ticket ภายในองค์กร วิธีนี้ช่วยให้ตรวจสอบย้อนหลังได้ง่ายขึ้นมาก

9. เชื่อมระบบหลังบ้านอย่างปลอดภัย

เมื่อมีหน้า Admin สำหรับจัดการสิทธิ์แล้ว ควรป้องกันส่วนนี้อย่างเข้มงวดกว่าหน้าระบบทั่วไป โดยแนวทางที่ควรใช้คือ

  • แยก Role/Permission สำหรับหน้า Admin ออกจากระบบปกติ
  • เปิดใช้ 2FA สำหรับผู้ที่สามารถแก้ไขสิทธิ์ได้
  • แยก route เช่น /admin
  • ตั้งค่า rate limit สำหรับ endpoint สำคัญ

การป้องกันระดับนี้ช่วยลดความเสี่ยงจากการเข้าถึงระบบหลังบ้านโดยไม่ได้รับอนุญาต

10. Checklist ก่อนขึ้นโปรดักชัน

ก่อนนำระบบ RBAC ขึ้นใช้งานจริง ควรตรวจสอบอย่างน้อยตามรายการต่อไปนี้

  • ผู้ใช้ที่ไม่มี permission ถูกบล็อกได้จริง
  • สิทธิ์ที่เปลี่ยนแล้วมีผลทันที หรือภายในเวลาที่กำหนด
  • เมื่อยกเลิก role แล้ว ไม่มีสิทธิ์ค้างอยู่ในระบบ
  • Audit log ถูกเก็บครบและค้นหาย้อนหลังได้
  • มีบัญชี break-glass สำหรับกรณีฉุกเฉิน และเก็บไว้อย่างปลอดภัย

Checklist นี้ช่วยลดปัญหาใหญ่ที่มักเกิดหลังระบบขึ้นโปรดักชัน

11. ตัวอย่างการ map Permission กับฟีเจอร์

การกำหนดสิทธิ์ให้ฟีเจอร์สามารถคิดแบบตรงไปตรงมาได้ เช่น

  • หน้า Users List ต้องมี user.read
  • ปุ่ม Create User ต้องมี user.create
  • ปุ่ม Reset Password ต้องมี user.update และอาจเพิ่ม auth.reset_password
  • หน้า Billing ควรแยก billing.read กับ billing.update

วิธีคิดแบบนี้ช่วยให้ทั้งทีมเข้าใจตรงกัน และลดโอกาสเกิดสิทธิ์ซ้อนทับแบบไม่ตั้งใจ

12. แนวทางต่อยอดในอนาคต

เมื่อระบบ RBAC เริ่มนิ่งแล้ว อาจพัฒนาต่อได้อีก เช่น

  • เพิ่ม ABAC เพื่อกำหนดเงื่อนไขตามข้อมูล เช่น อ่านได้เฉพาะข้อมูลของทีมตัวเอง
  • เพิ่ม policy ตาม resource เช่น แก้ไขโพสต์ของตัวเองได้ แต่แก้ของคนอื่นไม่ได้

การต่อยอดลักษณะนี้ช่วยให้ระบบยืดหยุ่นขึ้น โดยยังใช้ RBAC เป็นฐานหลักได้อยู่

ข้อแนะนำเล็ก ๆ ที่ช่วยได้มาก

ควรตั้งชื่อ Permission ให้เป็นมาตรฐานเดียวกันทั้งทีม และสรุปไว้ในเอกสารสั้น ๆ สัก 1 หน้า เพราะเอกสารนี้จะช่วยให้ทุกคนเข้าใจตรงกันทั้งฝั่งพัฒนา ทดสอบ และดูแลระบบ

สรุป

RBAC ที่ใช้งานได้ดีไม่จำเป็นต้องเริ่มจากระบบใหญ่หรือซับซ้อน สิ่งสำคัญคือการใช้ Role เป็นศูนย์กลาง และให้ Permission เป็นหน่วยย่อย ที่ชัดเจน จากนั้นจึงออกแบบฐานข้อมูล Middleware หน้า Admin และ Audit Log ให้สอดคล้องกัน

หากทำได้ครบตามแนวทางนี้ ระบบจะดูแลง่าย ปลอดภัย และพร้อมขยายต่อในอนาคตโดยไม่กลายเป็นภาระของทีมพัฒนา