ในฐานะนักพัฒนาระบบระดับ 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 เพื่อรับประกันความสมบูรณ์ของข้อมูลและความปลอดภัยสูงสุด