import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.*; @Configuration @AutoConfigureBefore(SecurityConfig.class) public class MyMvcConfigurer implements WebMvcConfigurer { public void addCorsMappings(CorsRegistry registry){ LOGGER.info("跨域已设置"); registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*") .allowedHeaders("*") .allowCredentials(true) .maxAge(3600); } }
Apabila menyepadukan Keselamatan, didapati masih terdapat masalah merentas domain apabila bahagian hadapan dan bahagian belakang dipisahkan hanya menggunakan kaedah di atas,
@Configuration @AutoConfigureBefore(Swagger2Configuration.class) @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) @Order(-1) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginProcessingUrl("/user/login") .loginPage("/singIn.html") .successHandler(moyuAuthenticationSuccessHandler) .failureHandler(moyuAuthenticationFailureHandler) .and() .apply(moyuSocialSecurityConfig) .and() .rememberMe() .tokenRepository(persistentTokenRepository()) .tokenValiditySeconds(3600*24*7) .userDetailsService(userDetailsService) .and() .authorizeRequests() .antMatchers("/user/login","/login","/singIn.html","**","/**").permitAll() .anyRequest() .authenticated() .and() .cors() .and() .csrf().disable(); } }
.and() .cors()//新加入 .and() .csrf().disable();
Projek terbaharu telah menggunakan rangka kerja pemisahan bahagian hadapan dan belakang , antara muka hadapan dan belakang tidak digunakan pada satu tapak dan merentas masalah domain berlaku Apa itu cross-domain, saya tidak akan pergi ke butiran di sini, tetapi hanya bercakap tentang penyelesaian.
Kod khusus adalah seperti berikut:
@Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); final CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowCredentials(true); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); }
Selepas konfigurasi selesai, uji. panggil dan laporkan ralat 401, tetapi ia masih tidak berfungsi. Selepas menyemak maklumat dalam talian, saya mengetahui bahawa permintaan merentas domain akan dibuat dua kali. Proses khusus ditunjukkan dalam rajah di bawah:
Untuk setiap permintaan merentas domain, sebelum permintaan sebenar sampai ke bahagian belakang, penyemak imbas akan memulakan permintaan prapenerbangan dahulu dan kaedah permintaan ialah PILIHAN untuk menanyakan pelayan sama ada untuk menerima permintaan merentas domain, parameter khusus adalah seperti berikut:
Walau bagaimanapun, permintaan ini tidak boleh membawa kuki dan sendiri. -tajuk yang ditentukan.
Memandangkan keselamatan Spring telah diperkenalkan dalam projek, kaedah penghantaran token yang saya gunakan ialah menggunakan medan kebenaran dalam pengepala Dengan cara ini, saya bergantung pada Spring Security untuk memintas permintaan prapenerbangan dan mendapati bahawa ia tidak membawa token, dan ralat 401 akan dilaporkan, tidak dibenarkan .
untuk membuat keselamatan Spring tidak mengesahkan permintaan prapenerbangan.
@Override public void configure(HttpSecurity http) throws Exception { ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = http.authorizeRequests(); registry.requestMatchers(CorsUtils::isPreFlightRequest).permitAll();//让Spring security放行所有preflight request }
Ia telah dibetulkan selepas mencuba sekali lagi, tetapi mengkonfigurasi secara langsung bahagian belakang untuk menyokong merentas domain akan menghasilkan dua permintaan. Cara lain ialah menggunakan Nginx untuk memajukan permintaan.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah yang SpringBoot+Spring Security tidak dapat mencapai merentas domain. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!