Rumah >Java >javaTutorial >Bagaimana untuk menyelesaikan masalah yang SpringBoot+Spring Security tidak dapat mencapai merentas domain

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

WBOY
WBOYke hadapan
2023-05-16 15:40:551110semak imbas

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);
    }
}

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();
    }
}

Fokus untuk menambah kod:

   .and()
   .cors()//新加入
   .and()
   .csrf().disable();

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);
    }

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 
    }

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam