ป้ายกำกับ: ตารางบังคับ

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

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

อ่านเพิ่มเติม