PlusMagi's Blog By Pitt Phunsanit Database Spring Security: Database

Spring Security: Database

ในฐานะนักพัฒนาระบบระดับ Senior Architect คุณทราบดีว่าการเลือกใช้โครงสร้างฐานข้อมูลที่เหมาะสมคือหัวใจสำคัญของความมั่นคงปลอดภัยของแอปพลิเคชัน Spring Security โดยทั่วไปแล้ว Spring Security ไม่ได้กำหนดโครงสร้างตารางบังคับ (Fixed Schema) มาให้ ทำให้เรามีอิสระอย่างเต็มที่ในการออกแบบฐานข้อมูลให้สอดคล้องกับความต้องการทางธุรกิจเฉพาะเจาะจงของคุณ

บทความนี้จะนำเสนอแนวทางการออกแบบ Schema สำหรับการใช้งาน Spring Security โดยเน้นการใช้ PostgreSQL ซึ่งเป็นระบบฐานข้อมูลที่ได้รับความนิยมในองค์กรขนาดใหญ่ พร้อมทั้งให้ตัวอย่างโค้ด SQL ที่สมบูรณ์แบบ

💡 แนวทางการออกแบบ Schema: Custom Schema (แนะนำ)

เราขอแนะนำให้ใช้แนวทาง Custom Schema เนื่องจากความยืดหยุ่นสูงสุด คุณสามารถเพิ่มคอลัมน์ที่จำเป็นต่อธุรกิจ เช่น ชื่อภาษาไทย (Full Name), เบอร์โทรศัพท์, หรือวันที่หมดอายุบัญชี ได้อย่างง่ายดาย โดยยังคงรักษาโครงสร้างพื้นฐานที่ Spring Security ต้องการไว้

⚙️ โครงสร้างตารางที่จำเป็นสำหรับ PostgreSQL

การจัดการสิทธิ์ (Authorization) ที่ถูกต้องตามหลักการของ Role-Based Access Control (RBAC) ต้องประกอบด้วย 3 ตารางหลักดังนี้:

Table Name Purpose Key Columns (PostgreSQL Type)
app_users เก็บข้อมูลผู้ใช้งานหลัก user_id (BIGSERIAL), username (VARCHAR), password (VARCHAR), enabled (BOOLEAN)
app_roles เก็บรายการสิทธิ์ (เช่น ROLE_USER, ROLE_ADMIN) role_id (SERIAL), role_name (VARCHAR)
user_roles ตารางกลางสำหรับเชื่อมโยงผู้ใช้กับบทบาท user_id (BIGINT), role_id (INT)

💻 ตัวอย่างคำสั่ง SQL สำหรับ PostgreSQL

คุณสามารถสร้างโครงสร้างตารางเหล่านี้ใน PostgreSQL ได้ด้วยคำสั่ง SQL ต่อไปนี้:

SQL

-- 1. ตารางผู้ใช้งาน (Users Table) --
CREATE TABLE app_users (
    user_id BIGSERIAL PRIMARY KEY,
    username VARCHAR(100) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL, -- ต้องเก็บรหัสผ่านที่เข้ารหัสด้วย BCrypt
    email VARCHAR(100),
    full_name VARCHAR(255),
    is_enabled BOOLEAN DEFAULT TRUE
);

-- 2. ตารางบทบาท (Roles Table) --
CREATE TABLE app_roles (
    role_id SERIAL PRIMARY KEY,
    role_name VARCHAR(100) UNIQUE NOT NULL
);

-- 3. ตารางเชื่อมโยง (User_Roles Mapping Table) --
CREATE TABLE user_roles (
    user_id BIGINT REFERENCES app_users(user_id) ON DELETE CASCADE,
    role_id INT REFERENCES app_roles(role_id) ON DELETE CASCADE,
    PRIMARY KEY (user_id, role_id)
);

☕ การเชื่อมโยงกับ Java/JPA (Spring Boot)

เมื่อใช้ Spring Data JPA คุณควรใช้ `@Table(name = “app_users”)` เพื่อระบุชื่อตารางให้ตรงกับ PostgreSQL เพื่อให้เกิดความสอดคล้องในการทำงานระหว่าง Object Model กับ Database Schema

✅ สรุปและข้อควรจำสำหรับ Senior Architect

การออกแบบ Spring Security Database ด้วย PostgreSQL อย่างถูกต้องตามหลักการ Custom Schema ไม่เพียงแต่ทำให้ระบบของคุณมีความยืดหยุ่นสูงเท่านั้น แต่ยังช่วยให้คุณสามารถปรับปรุงและขยายฟังก์ชันการทำงานด้านความปลอดภัย (เช่น การเพิ่มฟิลด์วันหมดอายุบัญชี หรือการรองรับ MFA) ได้อย่างง่ายดายในอนาคต สิ่งสำคัญคือการรักษาความสอดคล้องของ Data Type และการใช้ Primary/Foreign Key ที่ถูกต้องตามมาตรฐาน PostgreSQL เพื่อรับประกันความสมบูรณ์ของข้อมูลและความปลอดภัยสูงสุด

Exit mobile version