Heim >Java >javaLernprogramm >So lösen Sie das Problem, dass SpringBoot + Spring Security keine domänenübergreifende Implementierung erreichen kann
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
@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();
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.
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:
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:
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.
, 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!