ป้ายกำกับ: Support

Spring Boot: Spring SecuritySpring Boot: Spring Security

Spring Security เป็นเฟรมเวิร์กที่มีประสิทธิภาพสูงและยืดหยุ่นมากสำหรับการจัดการความปลอดภัยในแอปพลิเคชัน Java โดยเฉพาะอย่างยิ่งในระบบที่พัฒนาด้วย Spring Boot หน้าที่หลักของมันคือการควบคุม Authentication และ Authorization เพื่อป้องกันการเข้าถึงทรัพยากรโดยไม่ได้รับอนุญาต


แนวคิดพื้นฐานที่ควรรู้

ก่อนจะเริ่มลงมือเขียนโค้ด มี 2 คำศัพท์สำคัญที่ต้องเข้าใจแยกจากกันให้ชัดเจน

  1. Authentication : กระบวนการตรวจสอบว่าผู้ใช้งานคือคนที่เขากล่าวอ้างจริงหรือไม่ เช่น การกรอก Username และ Password หรือการใช้ Token
  2. Authorization : เมื่อยืนยันตัวตนแล้ว ระบบจะตรวจสอบต่อว่าคุณมีสิทธิ์เข้าถึงหน้าเว็บหรือใช้งาน API เส้นนั้นหรือไม่ เช่น สิทธิ์ของ “Admin” เท่านั้นที่ลบข้อมูลได้

กลไกการทำงาน: Servlet Filter Chain

Spring Security ทำงานอยู่บนพื้นฐานของ Servlet Filters โดยสร้างชุดของ Filter มาดักจับ Request ที่ส่งเข้ามายัง Server ก่อนที่จะไปถึง Controller ของเรา

  • เมื่อมี Request เข้ามา มันจะผ่านดักตามลำดับ เช่น ตรวจสอบว่ามีการส่ง Token มาไหม, ตรวจสอบว่า Session หมดอายุหรือยัง, จนไปถึงขั้นสุดท้ายว่าสิทธิ์ที่มีอยู่นั้นอนุญาตให้เข้าถึง URL นี้หรือไม่

ฟีเจอร์หลักของ Spring Security

  • Protection against exploits: ป้องกันการโจมตีพื้นฐานได้โดยอัตโนมัติ เช่น CSRF , CORS และ Security Headers ต่าง ๆ
  • Method Level Security: สามารถกำหนดสิทธิ์ในระดับฟังก์ชันได้เลย เช่น ใช้ Annotation @PreAuthorize ("hasRole ('ADMIN') ") บนหัว Method
  • OAuth2 / OpenID Connect: รองรับการทำ Login ผ่าน Social Media (Google, GitHub, Facebook) หรือระบบ Centralized Login ได้อย่างง่ายดาย
  • SAML Support: สำหรับการทำ Single Sign-On (SSO) ในระดับองค์กร

ตัวอย่างการตั้งค่าเบื้องต้น

ในเวอร์ชันปัจจุบัน เราจะใช้การสร้าง Bean ของ SecurityFilterChain เพื่อกำหนดค่าความปลอดภัย
src/main/java/com/example/demo/config/SecurityConfig.java

@Configuration
@EnableWebSecurity
public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain (HttpSecurity http) throws Exception { http .authorizeHttpRequests (auth -> auth .requestMatchers ("/public/**") .permitAll () // อนุญาตให้ทุกคนเข้าถึง path นี้ .anyRequest () .authenticated () // path อื่น ๆ ต้อง Login ก่อน) .formLogin (Customizer.withDefaults ()) // เปิดใช้งาน Login Form มาตรฐาน .httpBasic (Customizer.withDefaults ()) ; // รองรับ Basic Auth return http.build () ; }
}

การใช้ Spring Security ช่วยให้เราไม่ต้อง “สร้างโค้ทใหม่” ในเรื่องความปลอดภัยที่มีความซับซ้อนสูง และช่วยลดข้อผิดพลาดที่อาจนำไปสู่ช่องโหว่ร้ายแรงได้ อย่างไรก็ตาม ควรหมั่นอัปเดตเวอร์ชันและตรวจสอบการตั้งค่า ให้เหมาะสมกับประเภทของแอปพลิเคชันเสมอ