เหมือนเป็นทางเลือกแปลก ๆ แต่จากที่เคยใช้มาใน Laravel Jetstream, Laravel-Permission มันเป็นอะไรที่ครบ มีความยืดหยุ่นสูง (Role-Based Access Control: RBAC) และรองรับฟีเจอร์สมัยใหม่ได้ครบถ้วนและสมบูรณ์ในตัวเองอยู่แล้ว เลยอยากจะใช้โครงสร้างตารางเดียวกัน แทนที่จะมาออกแบบใหม่ตั้งแต่ต้น
โครงสร้างตาราง (Database Schema)
| ตาราง (Table) | หน้าที่ |
users | เก็บข้อมูลหลัก (id, username, password, email, profile_photo_path) |
roles | เก็บชื่อสิทธิ์หลัก (เช่น admin, editor, user) |
permissions | เก็บสิทธิ์ย่อย (เช่น edit-post, delete-user) |
model_has_roles | เชื่อม User กับ Role (Pivot Table) |
role_has_permissions | เชื่อม Role กับ Permission (Pivot Table) |
สร้างไฟล์ SQL
src/main/resources/db/migration/V1__create_auth_tables.sql
-- 1. Table Users (Jetstream Style) CREATE TABLE users (id BIGINT IDENTITY (1,1) PRIMARY KEY, username NVARCHAR (255) NOT NULL UNIQUE, password NVARCHAR (255) NOT NULL, email NVARCHAR (255) UNIQUE, full_name NVARCHAR (255) , -- รองรับภาษาไทย Thai_100_CI_AS profile_photo_path NVARCHAR (2048) , created_at DATETIME2 DEFAULT GETDATE () , updated_at DATETIME2) ; -- 2. Table Roles (Spatie Style) CREATE TABLE roles (id BIGINT IDENTITY (1,1) PRIMARY KEY, name NVARCHAR (100) NOT NULL UNIQUE, -- เช่น ROLE_ADMIN guard_name NVARCHAR (50) DEFAULT 'web') ; -- 3. Table Permissions
CREATE TABLE permissions (id BIGINT IDENTITY (1,1) PRIMARY KEY, name NVARCHAR (100) NOT NULL UNIQUE, -- เช่น user-create guard_name NVARCHAR (50) DEFAULT 'web') ; -- 4. User Has Roles (Pivot) CREATE TABLE model_has_roles (role_id BIGINT NOT NULL, model_id BIGINT NOT NULL, -- user id PRIMARY KEY (role_id, model_id) , CONSTRAINT fk_role FOREIGN KEY (role_id) REFERENCES roles (id) ON DELETE CASCADE, CONSTRAINT fk_user_role FOREIGN KEY (model_id) REFERENCES users (id) ON DELETE CASCADE) ; -- 5. Role Has Permissions (Pivot) CREATE TABLE role_has_permissions (permission_id BIGINT NOT NULL, role_id BIGINT NOT NULL, PRIMARY KEY (permission_id, role_id) , CONSTRAINT fk_perm FOREIGN KEY (permission_id) REFERENCES permissions (id) ON DELETE CASCADE, CONSTRAINT fk_role_perm FOREIGN KEY (role_id) REFERENCES roles (id) ON DELETE CASCADE) ;
อ่านเพิ่มเติม