PlusMagi's Blog By Pitt Phunsanit Backend,Cybersecurity Java: spring-security-web (login )

Java: spring-security-web (login )

ในฐานะ 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 อย่างแท้จริง