0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Hướng Dẫn Cấu Hình CORS Trong Spring Boot: Từ Cấp Độ Controller, Global Đến Spring Security

Đăng vào 2 tuần trước

• 4 phút đọc

Giới Thiệu

Chào các bạn, trong bài viết này, mình sẽ tiếp tục phần 1 trước đó về CORS (Cross-Origin Resource Sharing) và hướng dẫn cách cấu hình CORS trong ứng dụng Spring Boot. Đây là chủ đề rất quan trọng đối với việc phát triển web, đặc biệt là khi ứng dụng của bạn cần giao tiếp với nhiều nguồn khác nhau từ các miền khác nhau.

Những Cách Cấu Hình CORS Trong Spring Boot

Trong Spring Boot, có ba cấp độ chính mà bạn có thể cấu hình CORS:

  1. Mức độ Controller
  2. Global (WebMvcConfigurer)
  3. Trong Spring Security

Lưu ý: Trong bài viết này, mình sẽ không đề cập đến cấu hình CORS với Spring Webflux.

1. Cấu Hình CORS Trong Controller

Cách đơn giản nhất để cấu hình CORS là sử dụng annotation @CrossOrigin ngay trên controller hoặc trên từng endpoint.

Ưu Điểm

  • Phù hợp khi bạn muốn cấu hình CORS cho một số endpoint cụ thể.
  • Dễ hiểu và dễ quản lý nếu bạn có ít endpoint.

Ví dụ:

java Copy
@RestController
@RequestMapping("/api/users")
public class UserController {

    // Bật CORS cho endpoint này
    @CrossOrigin(origins = "http://example.com")
    @GetMapping("/{id}")
    public String getUser(@PathVariable String id) {
        return "User ID: " + id;
    }

    // Không có @CrossOrigin => Không bật CORS
    @PostMapping
    public String createUser(@RequestBody String user) {
        return "User created: " + user;
    }
}
  • Trong ví dụ trên, browser chỉ cho phép request từ http://example.com khi gọi API /api/users/{id}.

Nhược Điểm

1. Quản lý khó khăn trong ứng dụng lớn:

  • Nếu nhiều controller hoặc endpoint, việc sử dụng @CrossOrigin sẽ gây lặp lại, khó bảo trì.
  • Khi cần thay đổi chính sách CORS, bạn phải điều chỉnh ở nhiều nơi.

2. Không phù hợp với cấu hình phức tạp:

  • @CrossOrigin không cho phép tùy chỉnh tất cả các tùy chọn phức tạp như headers, thời gian caching cho preflight.

3. Vấn đề với Spring Security:

  • Nếu bạn sử dụng Spring Security, các request HTTP sẽ bị xử lý qua filter chain trước khi đến controller, dẫn đến việc cấu hình CORS có thể bị bỏ qua nếu không được cấu hình đúng trong security.

2. Cấu Hình CORS Ở Mức Global (WebMvcConfigurer)

Cách thứ hai, bạn có thể cấu hình CORS ở mức toàn cầu để áp dụng cho tất cả các endpoint bằng cách sử dụng WebMvcConfigurer.

Ví dụ cấu hình:

java Copy
@Configuration
public class GlobalCorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("https://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("Authorization", "Content-Type")
                .allowCredentials(true);
    }
}
  • Việc cấu hình CORS ở mức toàn cầu rất đơn giản và đảm bảo tăng tính dễ quản lý của ứng dụng.

3. Cấu Hình Trong Spring Security

Cuối cùng, bạn có thể cấu hình CORS ngay trong Spring Security. Việc này sẽ cho phép cấu hình CORS áp dụng cho các yêu cầu được bảo vệ bởi Spring Security.

Ví dụ cấu hình:

java Copy
@Configuration
public class SecurityConfig {
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(List.of("https://example.com", "https://viblo.asia"));
        configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        configuration.setAllowedHeaders(List.of("Authorization", "Content-Type"));
        configuration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/api/**", configuration);
        return source;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.cors().and()
                .authorizeHttpRequests(auth -> auth.anyRequest().permitAll())
                .httpBasic(Customizer.withDefaults())
                .csrf(csrf -> csrf.disable());

        return http.build();
    }
}

Kết Luận

Như vậy, việc cấu hình CORS trong Spring Boot không hề phức tạp, nhưng bạn cần chú ý sẽ áp dụng ở đâu cho hợp lý tùy theo mô hình ứng dụng bạn đang phát triển. Hi vọng những chia sẻ này sẽ giúp ích cho bạn trong quá trình làm việc với Spring Boot. Nếu bạn có bất kỳ câu hỏi hay ý kiến phản hồi nào, hãy để lại comment ở phía dưới!

Cảm ơn bạn đã đọc bài viết này!

Sài Gòn, 15:06 22/12/2024
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào