Rumah > Java > javaTutorial > teks badan

Bagaimana untuk menyelesaikan masalah yang SpringBoot+Spring Security tidak dapat mencapai merentas domain

WBOY
Lepaskan: 2023-05-16 15:40:55
ke hadapan
1101 orang telah melayarinya

SpringBoot+Spring Security tidak boleh mencapai merentas domain

Merentas domain apabila Keselamatan tidak digunakan:

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);
    }
}
Salin selepas log masuk

Apabila menyepadukan Keselamatan, didapati masih terdapat masalah merentas domain apabila bahagian hadapan dan bahagian belakang dipisahkan hanya menggunakan kaedah di atas,

Penyelesaian adalah seperti berikut:

@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();
    }
}
Salin selepas log masuk

Fokus untuk menambah kod:

   .and()
   .cors()//新加入
   .and()
   .csrf().disable();
Salin selepas log masuk

Rujuk kepada pemprosesan domain merentas projek Spring Security

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.

Spring mempunyai banyak cara untuk menyelesaikan masalah merentas domain secara peribadi saya menggunakan Crosfilter

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);
    }
Salin selepas log masuk

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:

SpringBoot+Spring Security无法实现跨域怎么解决

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:

SpringBoot+Spring Security无法实现跨域怎么解决

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 .

Menyelesaikan masalah ini sangat mudah Anda boleh menggunakan konfigurasi berikut

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 
    }
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan