เหมือนเป็นทางเลือกแปลก ๆ แต่จากที่เคยใช้มาใน 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
);
อ่านเพิ่มเติม
