ในโลกของการพัฒนาแอปพลิเคชันที่ซับซ้อน การจัดการสิทธิ์การเข้าถึง (Authorization) ถือเป็นหัวใจสำคัญของความปลอดภัย ระบบ Role-Based Access Control (RBAC) คือมาตรฐานที่ถูกนำมาใช้เพื่อกำหนดว่าผู้ใช้แต่ละกลุ่ม (Role) มีสิทธิ์ทำอะไรได้บ้าง
แม้ว่า Spring Security จะเป็นเฟรมเวิร์กที่ทำงานบน Java แต่หลักการทางสถาปัตยกรรมของ RBAC นั้นเป็นสากล และโครงสร้างฐานข้อมูลที่ได้รับความนิยมอย่าง Laravel Jetstream ก็เป็นต้นแบบที่แข็งแกร่งและยืดหยุ่นอย่างยิ่ง บทความนี้จะนำเสนอวิธีการสร้างโครงสร้างฐานข้อมูล RBAC ที่สมบูรณ์แบบสำหรับใช้งานกับ Spring Security โดยใช้ไวยากรณ์ของ PostgreSQL
โครงสร้างฐานข้อมูล RBAC ด้วย PostgreSQL
เราจะใช้หลักการของตาราง Pivot (Many-to-Many Relationship) เพื่อเชื่อมโยง User, Roles, และ Permissions เข้าด้วยกัน โครงสร้างนี้ประกอบด้วย 5 ตารางหลัก:
users: เก็บข้อมูลผู้ใช้หลักroles: เก็บชื่อบทบาท (เช่น Admin, Editor)permissions: เก็บสิทธิ์ย่อย (เช่นedit-post,delete-user)model_has_roles: ตารางเชื่อม User กับ Rolerole_has_permissions: ตารางเชื่อม Role กับ Permission
การสร้าง Schema ด้วย PostgreSQL
การใช้ PostgreSQL ช่วยให้เราสามารถกำหนดข้อจำกัด (Constraints) และความสมบูรณ์ของข้อมูล (Integrity) ได้อย่างแม่นยำ นี่คือชุดคำสั่ง SQL ที่สมบูรณ์สำหรับการสร้าง Schema ทั้งหมด:
SQL
-- 1. Users Table (เก็บข้อมูลผู้ใช้) CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(255) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
profile_photo_path VARCHAR(255)
);
-- 2. Roles Table (เก็บบทบาทหลัก) CREATE TABLE roles (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
description TEXT
);
-- 3. Permissions Table (เก็บสิทธิ์ย่อย) CREATE TABLE permissions (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
description TEXT
);
-- 4. model_has_roles (เชื่อม User กับ Role) CREATE TABLE model_has_roles (
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
role_id INTEGER REFERENCES roles(id) ON DELETE CASCADE,
PRIMARY KEY (user_id, role_id)
);
-- 5. role_has_permissions (เชื่อม Role กับ Permission) CREATE TABLE role_has_permissions (
role_id INTEGER REFERENCES roles(id) ON DELETE CASCADE,
permission_id INTEGER REFERENCES permissions(id) ON DELETE CASCADE,
PRIMARY KEY (role_id, permission_id)
);
การใช้งานและการเชื่อมโยงข้อมูล (Seeding)
หลังจากสร้างโครงสร้างแล้ว ขั้นตอนต่อไปคือการใส่ข้อมูลเริ่มต้น (Seeding) เพื่อให้ระบบทำงานได้จริง ตัวอย่างเช่น การกำหนดให้ Role ‘Admin’ มีสิทธิ์ delete-user และ edit-post:
SQL
-- 1. Insert Roles and Permissions
INSERT INTO roles (name) VALUES ('Admin'), ('Editor'), ('User');
INSERT INTO permissions (name) VALUES ('edit-post'), ('delete-user'), ('view-dashboard');
-- 2. Assign Role to User (สมมติ User ID 1 เป็น Admin)
INSERT INTO model_has_roles (user_id, role_id) VALUES (1, 1); -- Role ID 1 คือ Admin
-- 3. Assign Permissions to Role (Admin Role ID 1 มีสิทธิ์ delete-user และ edit-post)
INSERT INTO role_has_permissions (role_id, permission_id) VALUES
(1, 2), -- Admin ได้ delete-user
(1, 1); -- Admin ได้ edit-post
สรุปและข้อได้เปรียบทางสถาปัตยกรรม
การใช้โครงสร้าง RBAC ที่ยืดหยุ่นนี้ ทำให้ Spring Security สามารถตรวจสอบสิทธิ์ได้โดยการ Query ข้อมูลผ่านตาราง Pivot เหล่านี้ ซึ่งช่วยให้เราสามารถเพิ่ม Role หรือ Permission ใหม่ๆ ได้โดยไม่จำเป็นต้องแก้ไขโค้ดหลัก (Decoupling) การยึดตามรูปแบบของ Laravel ทำให้มั่นใจได้ว่าสถาปัตยกรรมที่สร้างขึ้นนั้นมีความเป็นมาตรฐานสูง (Standardized) และพร้อมสำหรับการขยายตัวในอนาคต