PlusMagi's Blog By Pitt Phunsanit Backend,Cybersecurity Spring Security: SecurityConfig

Spring Security: SecurityConfig

ในฐานะ Senior Architect การตั้งค่าระบบความปลอดภัย (Security) ให้แข็งแกร่งตั้งแต่ต้นเป็นสิ่งสำคัญที่สุด Spring Security คือเฟรมเวิร์กที่ทรงพลังในการจัดการการยืนยันตัวตน (Authentication) และการอนุญาต (Authorization) ของแอปพลิเคชัน Java ของคุณ

เมื่อคุณใช้ PostgreSQL เป็นฐานข้อมูลหลักในการจัดเก็บข้อมูลผู้ใช้งาน (Users), บทบาท (Roles), และสิทธิ์ (Permissions) การกำหนดค่าในไฟล์ SecurityConfig จึงเป็นขั้นตอนสำคัญที่ทำหน้าที่เป็นประตูหลักในการควบคุมการเข้าถึงทุกส่วนของระบบ

⚙️ บทบาทของ SecurityConfig ในระบบ PostgreSQL

ไฟล์ SecurityConfig คือจุดศูนย์กลางในการกำหนดกฎเกณฑ์ด้านความปลอดภัยทั้งหมดของแอปพลิเคชัน ไม่ว่าจะเป็นการกำหนดว่าหน้าไหนต้อง Login, การจัดการ Session, หรือการกำหนดว่าผู้ใช้ที่มีบทบาทใดสามารถเข้าถึง API Endpoint ใดได้บ้าง

ในบริบทของการเชื่อมต่อกับ PostgreSQL เราต้องมั่นใจว่า SecurityConfig ได้ผูกติดกับ UserDetailsService ที่ดึงข้อมูลผู้ใช้จากฐานข้อมูลได้อย่างถูกต้อง และกำหนดให้มีการตรวจสอบข้อมูลผู้ใช้ (Username/Password) ผ่านกลไกที่เชื่อถือได้

📝 ตัวอย่างการตั้งค่า SecurityConfig (Java)

การตั้งค่าที่ทันสมัยใน Spring Boot 3+ จะใช้การกำหนด Bean สำหรับ SecurityFilterChain โดยโค้ดนี้จะกำหนดให้มีการใช้ UserDetailsService ที่เราสร้างขึ้นเพื่อดึงข้อมูลจาก PostgreSQL และกำหนดการเข้าถึงพื้นฐาน:

Java

package com.example.demo.config;</code>
<pre><code class="language-java">import org.springframework.context.annotation.Bean;</code>
<pre><code class="language-java">import org.springframework.security.config.annotation.web.builders.HttpSecurity;</code>
<pre><code class="language-java">import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;</code>
<pre><code class="language-java">import org.springframework.security.core.userdetails.UserDetailsService;</code>
<pre><code class="language-java">import org.springframework.security.web.SecurityFilterChain;</code>
<pre><code class="language-java">import org.springframework.context.annotation.Configuration;</code>

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http)
            throws Exception {
        
        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/api/public/**").permitAll() // อนุญาตให้เข้าถึงหน้าสาธารณะ
                .requestMatchers("/api/admin/**").hasRole("ADMIN") // ต้องมีบทบาท ADMIN เท่านั้น
                .anyRequest().authenticated() // ส่วนที่เหลือต้อง Login ก่อน
            )
            .formLogin(form -> form
                .loginPage("/login") // กำหนดหน้า Login เฉพาะ
                .permitAll()
            )
            .logout(logout -> logout
                .permitAll()
            );
        
        return http.build();
    }
}

💡 การเชื่อมโยงกับ PostgreSQL และ Role-Based Access Control (RBAC)

แม้ว่าโค้ด SecurityConfig จะเป็น Java แต่การทำงานของมันขึ้นอยู่กับข้อมูลที่ดึงมาจาก PostgreSQL อย่างสมบูรณ์ เมื่อผู้ใช้ทำการ Login ระบบจะเรียกใช้ UserDetailsService ซึ่งจะทำการ Query ข้อมูลผู้ใช้และบทบาทจากตาราง users และ roles ใน PostgreSQL

การตั้งค่า .hasRole("ADMIN") ในโค้ดด้านบน จะทำงานได้ก็ต่อเมื่อ UserDetailsService สามารถดึงข้อมูลบทบาท ‘ADMIN’ จากฐานข้อมูล PostgreSQL และส่งผ่านไปยัง Spring Security ได้อย่างถูกต้อง

✅ บทสรุป: ความมั่นคงที่สมบูรณ์

การทำความเข้าใจ SecurityConfig ไม่ใช่แค่การเขียนโค้ด แต่คือการออกแบบโครงสร้างความปลอดภัยของแอปพลิเคชันทั้งหมด การกำหนดค่าที่แม่นยำและผูกติดกับแหล่งข้อมูลความจริง (Source of Truth) อย่าง PostgreSQL อย่างเหมาะสม จะช่วยให้คุณมั่นใจได้ว่าแอปพลิเคชันของคุณมีกลไกการป้องกันที่แข็งแกร่งและเป็นไปตามหลักการของ Role-Based Access Control (RBAC) อย่างแท้จริง

Exit mobile version