ป้ายกำกับ: Profiling Tools

Spring Security: RBAC (Laravel Style )Spring Security: RBAC (Laravel Style )

ในโลกของการพัฒนาแอปพลิเคชันที่ซับซ้อน การจัดการสิทธิ์การเข้าถึง (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 ตารางหลัก:

  1. users: เก็บข้อมูลผู้ใช้หลัก
  2. roles: เก็บชื่อบทบาท (เช่น Admin, Editor)
  3. permissions: เก็บสิทธิ์ย่อย (เช่น edit-post, delete-user)
  4. model_has_roles: ตารางเชื่อม User กับ Role
  5. role_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) และพร้อมสำหรับการขยายตัวในอนาคต