Heim >Java >javaLernprogramm >So lösen Sie das Problem, dass SpringBoot + Spring Security keine domänenübergreifende Implementierung erreichen kann

So lösen Sie das Problem, dass SpringBoot + Spring Security keine domänenübergreifende Implementierung erreichen kann

WBOY
WBOYnach vorne
2023-05-16 15:40:551110Durchsuche

SpringBoot + Spring Security kann keine domänenübergreifende Funktion erreichen.

Domänenübergreifend, wenn Sicherheit nicht verwendet wird:

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

Bei der Integration von Sicherheit haben wir festgestellt, dass es immer noch domänenübergreifende Probleme gibt, wenn nur die oben beschriebene Methode zum Trennen von Vorder- und Rückseite verwendet wird

Die Lösung lautet wie folgt:

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

Wichtige Punkte zum Hinzufügen von Code:

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

Zitat der domänenübergreifenden Verarbeitung des Spring Security-Projekts

Das aktuelle Projekt hat ein Framework mit Front-End und Back-End übernommen Die Front-End- und Back-End-Schnittstellen sind nicht auf einer Site bereitgestellt, und es sind domänenübergreifende Probleme aufgetreten. Ich werde hier nicht näher auf die Lösung eingehen.

Spring bietet viele Möglichkeiten, domänenübergreifende Probleme zu lösen.

Der spezifische Code lautet wie folgt:

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

Testen Sie den Aufruf und melden Sie einen Fehler 401 funktioniert nicht. Nachdem ich die Informationen online überprüft hatte, erfuhr ich, dass domänenübergreifende Anfragen zweimal gestellt werden. Der spezifische Prozess ist in der folgenden Abbildung dargestellt:

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

Bevor die eigentliche Anfrage das Backend erreicht, initiiert der Browser zunächst eine Preflight-Anfrage. Die Anfragemethode ist OPTIONS, um den Server zu fragen Akzeptieren Sie die domänenübergreifende Anfrage. Die spezifischen Parameter lauten wie folgt:

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

Diese Anfrage kann jedoch keine Cookies und selbstdefinierten Header enthalten.

Da die Spring-Sicherheit im Projekt eingeführt wurde, bestand die von mir verwendete Token-Übermittlungsmethode darin, das Autorisierungsfeld im Header zu verwenden. Auf diese Weise verließ ich mich auf Spring Security, um die Preflight-Anfrage abzufangen, und stellte fest, dass sie kein Token enthielt. Es wird ein Fehler 401 gemeldet, der darauf hinweist, dass keine Autorisierung vorliegt.

Die Lösung dieses Problems ist sehr einfach. Sie können die folgende Konfiguration verwenden

, um sicherzustellen, dass die Spring-Sicherheit die Preflight-Anfrage nicht überprüft.

 @Override
    public void configure(HttpSecurity http) throws Exception {
        ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry 
        = http.authorizeRequests();
        registry.requestMatchers(CorsUtils::isPreFlightRequest).permitAll();//让Spring security放行所有preflight request 
    }

Es wurde nach einem erneuten Versuch behoben, aber die direkte Konfiguration des Backends zur Unterstützung domänenübergreifender Unterstützung führt zu zwei Anfragen. Eine andere Möglichkeit besteht darin, Nginx zum Weiterleiten der Anfrage zu verwenden.

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem, dass SpringBoot + Spring Security keine domänenübergreifende Implementierung erreichen kann. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen