cuốn sách gpt4 ai đã làm

Cấu hình tên miền chéo trang nhã của SpringBoot theo nhiều cách và những cạm bẫy trong cấu hình truy cập tên miền chéo của Spring Security

In lại Tác giả: Người biết Thời gian cập nhật: 2024-03-13 05:56:33 30 4
mua khóa gpt4 Nike

Lời nói đầu

Gần đây, khi tôi đang thực hiện một dự án, tôi đã sử dụng hệ thống quản lý quyền dựa trên sự phân tách giữa giao diện người dùng và mặt sau. Spring Security được sử dụng trong phần phụ trợ dưới dạng quản lý kiểm soát quyền. Sau đó, quyền truy cập giao diện giao diện người dùng liên quan đến nhiều miền. Tuy nhiên, cho dù tôi đã định cấu hình tên miền chéo như thế nào thì việc sử dụng nó cũng không có hiệu lực.An ninh mùa xuânKhi được định cấu hình riêng, tên miền chéo SpringBoot là không đủ và tên miền chéo bảo mật cần được định cấu hình.

Tên miền chéo là gì

Tên miền chéo là một chính sách bảo mật có cùng nguồn gốc của trình duyệt, nghĩa là trình duyệt đơn phương hạn chế quyền truy cập tên miền chéo vào các tập lệnh

Trong HTML,, , ,

Phần phụ trợ đóng gói các kết quả trả về thành định dạng dữ liệu được yêu cầu

jsonp({ "error":200, "message://Yêu cầu thành công", "data":[{ "tên người dùng":"Zhang San", "age":20 }] })

Tóm tắt: JSONP triển khai rất đơn giản nhưng nó chỉ hỗ trợ các yêu cầu GET trên các miền, điều này có những hạn chế lớn.

CORS

CORS là một tiêu chuẩn W3C, có tên đầy đủ là "Chia sẻ tài nguyên Cross-origin", cho phép trình duyệt đưa ra các yêu cầu XMLHttpRequest tới các máy chủ cross-origin, từ đó khắc phục hạn chế là AJAX chỉ có thể được sử dụng từ cùng một nguồn.

Có một bộ trường tiêu đề HTTP mới trong thông số kỹ thuật, thông báo cho khách hàng về các hạn chế giữa nhiều miền bằng cách thêm Tiêu đề đặc biệt [Kiểm soát truy cập-Cho phép-Xuất xứ] vào máy chủ Nếu trình duyệt hỗ trợ CORS và xác định rằng Nguồn gốc. được thông qua, nó sẽ cho phép XMLHttpRequest khởi tạo các yêu cầu tên miền chéo
Lưu ý: CORS không hỗ trợ các trình duyệt dưới IE8

Thuộc tính tiêu đề CORS giải thích
Kiểm soát truy cập-Cho phép-Xuất xứ Cho phép miền http://www.xxx.com (do chính bạn đặt, chỉ là ví dụ ở đây) thực hiện yêu cầu tên miền chéo
Kiểm soát truy cập-Tuổi tối đa Đặt thành 86400 giây và không cần yêu cầu xác minh trước nữa.
Phương thức kiểm soát truy cập-Cho phép- Đặt phương thức để cho phép yêu cầu tên miền chéo
Kiểm soát truy cập-Cho phép-Tiêu đề Cho phép các yêu cầu tên miền chéo bao gồm loại nội dung
Kiểm soát truy cập-Cho phép-Thông tin xác thực Đặt để cho phép cookie

SpringBoot giải quyết phương thức span

Chú thích @CrossOrigin

Đây là chú thích đi kèm với SpringBoot. Cách sử dụng rất đơn giản. Bạn chỉ cần thêm chú thích cuối cùng vào giao diện tương ứng.

Điều đó có nghĩa là giao diện này hỗ trợ nhiều tên miền, trong đónguồn gốc = "*"
Cho biết tất cả các địa chỉ đều có thể truy cập vào giao diện này hoặc bạn có thể viết một địa chỉ cụ thể, cho biết chỉ địa chỉ này mới có thể truy cập vào giao diện.

Nó có thể được chú thích trên lớp và phương thức.bộ điều khiểnTất cả các giao diện đều hỗ trợ tên miền chéo. Một phương pháp duy nhất cho biết rằng chỉ giao diện này hỗ trợ tên miền chéo.
Mặc dù phương pháp này thanh lịch và đơn giản nhưng nhược điểm của nó không nhỏ. Các giao diện yêu cầu tên miền chéo cần được thêm vào chú thích này. Điều này không thân thiện với các dự án có sự tách biệt giữa front-end và back-end. nhiều lần nên phương pháp này về cơ bản rất hiếm được sử dụng.

Chế độ chặn

Ghi đè WebMvcConfigureraddCorsMappings phương pháp

@Configuration public class CorsConfig triển khai WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry register) { register.addMapping("/**")//Tất cả các giao diện trong dự án đều hỗ trợ cross-domain.allowedOriginPatterns("*")//Tất cả các địa chỉ Tất cả đều có thể được truy cập và các địa chỉ cụ thể cũng có thể được định cấu hình.allowCredentials(true) .allowedMethods("*")//"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS" .maxAge(3600);// Thời gian cho phép trên nhiều miền} }

Để ýallowOrigins("*")allowCredentials(true)ĐÚNG VẬYĐôi khi sẽ xảy ra lỗi và cần phải thay đổi thànhallowOriginPatterns("*")Hoặc chỉ định giao diện riêngallowOrigins("http//www.baidu.com")

@Cấu hìnhĐại diện cho một lớp cấu hình, lớp này sẽ được tải khi dự án bắt đầu. hoàn thànhTrình cấu hình WebMvcGiao diện và viết lạiaddCorsMappings phương pháp. Mã tương đối đơn giản và có ý kiến

Chế độ lọc bộ lọc

  1. Phương pháp một
@Bean public CorsFilter corsFilter() { //1. Thêm thông tin cấu hình CORS CorsConfiguration config = new CorsConfiguration(); // Những miền gốc nào được phép config.addAllowedOrigin("*"); // Có gửi thông tin Cookie config.setAllowCredentials hay không (true ); // Những miền gốc nào được phép (phương thức yêu cầu) config.addAllowedMethod("*"); // Những miền gốc nào được phép (thông tin tiêu đề) config.addAllowedHeader("*"); //Thông tin tiêu đề nào được hiển thị (vì truy cập tên miền chéo không thể lấy tất cả thông tin tiêu đề theo mặc định) config.addExposeHeader("*"); //2. UrlBasedCorsConfigurationSource (); configSource.registerCorsConfiguration("/**", config); //3. trả về CorsFilter mới (configSource);
  1. Phương pháp 2
    Phương pháp cấu hình nguyên bản nhất dựa trên máy chủ
@Slf4j @Component lớp công khai CorsFilter triển khai Bộ lọc { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) ném IOException, ServletException { HttpServletResponse phản hồi = (HttpServletResponse)servletResponse; reply.setHeader("Access-Control-Allow-Origin", "*"); reply.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); "Kiểm soát truy cập-Tuổi tối đa", "3600"); reply.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, client_id, uuid, Authorization"); bộ đệm, không lưu trữ, phải xác nhận lại"); reply.setHeader("Pragma", "no-cache"); filterChain.doFilter(servletRequest,response);

Ba phương pháp trên đều có thể giải quyết được vấn đề. Những phương pháp được sử dụng phổ biến nhất là phương pháp thứ nhất và thứ hai. Nói chung, không cần phải đi sâu vào chi tiết.

Nếu sử dụng ba phương thức cấu hình này thì phương thức nào sẽ có hiệu lực? Nó tương tự như kiểu trong css.nguyên tắc tiệm cận, hiểu rồi

Spring Security cho phép hỗ trợ CORS

Nếu sử dụng trong dự ánAn ninh mùa xuân Việc cấu hình phương thức mở rộng ở trên là chưa đủ, nó cần được chỉ định riêng.An ninh mùa xuânTên miền chéo
Nếu không thì khoảng thời gian sẽ không có hiệu lực

Spring Security hỗ trợ CORS rất tốt, chỉ cần kích hoạt hỗ trợ CORS trong bộ cấu hình và ghi nguồn cấu hình CORS

@Override protected void configure(HttpSecurity http) ném ngoại lệ { // Chúng tôi không cần CSRF cho ví dụ này http.cors().and().csrf().disable() // không xác thực yêu cầu cụ thể này .authorizeRequests( ).antMatchers("/", "/*.html", "/favicon.ico", "/css/**", "/js/**", "/fonts/**", "/layui/**", "/img/**", "/v3/api-docs/**", "/swagger-resources/**", "/webjars/ **", "/pages/**", "/druid/**", "/statics/**", "/login", "/register").permitAll(). // tất cả các yêu cầu khác cần phải được xác thực AnyRequest().authenticated().and(). // đảm bảo chúng tôi sử dụng phiên không trạng thái; phiên sẽ không được sử dụng để // lưu trữ trạng thái của người dùng. //Ghi đè ngoại lệ đăng nhập mặc định.authenticationEntryPoint(jwtAuthenticationEntryPoint).and ( ).sessionQuản lý() // Dựa trên mã thông báo, do đó không cần phiên .sessionCreationPolicy(SessionCreationPolicy.STATELESS); // Thêm bộ lọc để xác thực mã thông báo với mọi yêu cầu http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOriginPattern("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(true); ", corsConfiguration); trả về CorsFilter mới (nguồn }
30 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress