ในฐานะ Senior Architect ที่ดูแลระบบ Enterprise Application การจัดการความปลอดภัย (Authentication) ถือเป็นรากฐานที่สำคัญที่สุดของระบบ โดยเฉพาะอย่างยิ่งเมื่อเราใช้เฟรมเวิร์กอย่าง Spring Security ในการจัดการกระบวนการ Login แม้ว่า Spring Security จะเป็นตัวจัดการ Logic การตรวจสอบสิทธิ์ แต่ข้อมูลผู้ใช้ (User Details) และรหัสผ่านที่ถูกเข้ารหัส (Password Hash) จะต้องถูกจัดเก็บอย่างปลอดภัยในระบบฐานข้อมูลที่เชื่อถือได้ เช่น PostgreSQL
สถาปัตยกรรมข้อมูลสำหรับ Authentication ใน PostgreSQL
เมื่อเราพูดถึงการ Login ระบบไม่ได้เพียงแค่ตรวจสอบว่าชื่อผู้ใช้และรหัสผ่านถูกต้องเท่านั้น แต่ยังต้องมีการจัดการ Roles และสถานะความถูกต้องของบัญชีด้วย ดังนั้น การออกแบบ Schema ใน PostgreSQL จึงต้องรองรับข้อมูลเหล่านี้อย่างเป็นระบบ
เราจะสร้างตารางหลัก users เพื่อเก็บข้อมูลพื้นฐานของผู้ใช้ และใช้ฟังก์ชันการเข้ารหัส (Hashing) ที่แข็งแกร่ง เช่น BCrypt เพื่อเก็บรหัสผ่านเสมอ ห้ามเก็บรหัสผ่านเป็น Plain Text โดยเด็ดขาด
การสร้างตารางผู้ใช้ (Schema Definition)
SQL
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
username VARCHAR(100) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
email VARCHAR(100) UNIQUE,
is_enabled BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
กระบวนการตรวจสอบสิทธิ์ (Authentication Flow)
เมื่อผู้ใช้พยายาม Login ผ่าน Spring Security, ระบบจะเรียกใช้ Repository Layer เพื่อค้นหาข้อมูลผู้ใช้จาก PostgreSQL โดยใช้ Username เป็นตัวหลัก จากนั้นจึงนำรหัสผ่านที่ส่งมาเปรียบเทียบกับ password_hash ที่จัดเก็บไว้
ตัวอย่างการ Query ข้อมูลผู้ใช้เพื่อตรวจสอบความถูกต้องของ Username และ Hash:
SQL
SELECT user_id, username, password_hash, is_enabled FROM users WHERE username = 'user1' LIMIT 1;
ในชั้น Service Layer ของ Java (ที่ทำงานร่วมกับ Spring Security) จะรับผลลัพธ์นี้มา จากนั้นจึงใช้ Library เช่น Spring Security Crypto เพื่อทำการเปรียบเทียบรหัสผ่านที่ผู้ใช้ป้อนเข้ามากับค่า password_hash ที่ได้จากฐานข้อมูลอย่างปลอดภัย
การจัดการสิทธิ์ (Authorization) ด้วย PostgreSQL
นอกจากตารางผู้ใช้แล้ว การจัดการสิทธิ์ (Role-Based Access Control: RBAC) ควรแยกอยู่ในตาราง roles และตารางเชื่อมโยง user_roles เพื่อให้ระบบมีความยืดหยุ่นในการเพิ่ม/แก้ไขสิทธิ์โดยไม่กระทบกับตารางหลัก
SQL
CREATE TABLE roles (
role_id SERIAL PRIMARY KEY,
role_name VARCHAR(50) UNIQUE NOT NULL);
CREATE TABLE user_roles (
user_id INT REFERENCES users(user_id),
role_id INT REFERENCES roles(role_id),
PRIMARY KEY (user_id, role_id)
);
บทสรุป
การผสานรวม Spring Security กับ PostgreSQL อย่างถูกต้องตามหลักการสถาปัตยกรรมที่ดี ไม่ได้หมายถึงแค่การเชื่อมต่อฐานข้อมูลเท่านั้น แต่รวมถึงการออกแบบ Schema ที่ปลอดภัย การใช้ฟังก์ชัน Hashing ที่แข็งแกร่ง และการแยกส่วนของข้อมูลสิทธิ์อย่างชัดเจน การปฏิบัติตามแนวทางเหล่านี้จะช่วยให้แอปพลิเคชันของคุณมีความทนทานและปลอดภัยในระดับ Enterprise Architecture อย่างแท้จริง