SpringBoot+Spring Security 는 도 메 인 을 뛰 어 넘 는 해결 방안 을 실현 할 수 없습니다.

SpringBoot+Spring Security 에서 도 메 인 을 뛰 어 넘 을 수 없습니다.
Security 를 사용 하지 않 았 을 때 범위:

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);
    }
}
Security 를 통합 할 때 상기 방법 으로 만 앞 뒤 가 분 리 될 때 도 메 인 간 문제 가 존재 하 는 것 을 발견 합 니 다.
해결 방법 은 다음 과 같다.

@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();
Spring Security 프로젝트 의 크로스 필드 처리 참조
최근 프로젝트 는 앞 뒤 가 분 리 된 프레임 워 크 를 사 용 했 습 니 다.전단 과 백 스테이지 인 터 페 이 스 는 한 사이트 에 배치 되 지 않 았 고 크로스 도 메 인 문제 가 발생 했 습 니 다.크로스 도 메 인 이 무엇 인지 여 기 는 더 이상 군말 하지 않 고 해결 방법 을 직접 말 합 니 다.
Spring 은 크로스 오 버 를 해결 하 는 방식 이 많 습 니 다.개인 적 으로 Crosfilter 방식 을 사 용 했 습 니 다.
구체 적 인 코드 는 다음 과 같다.

@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);
    }
설정 이 완 료 된 후,테스트 호출,오류 401,여전히 안 됩 니 다.인터넷 에서 자 료 를 찾 아 보면 도 메 인 간 요청 이 두 번 진행 된다 는 것 을 알 수 있다.구체 적 인 절 차 는 다음 과 같다.
这里写图片描述
도 메 인 을 넘 어 요청 할 때마다 실제 요청 이 백 엔 드 에 도착 하기 전에 브 라 우 저 는 preflight request 를 시작 합 니 다.요청 방식 은 OPTIONS 입 니 다.서버 에서 이 도 메 인 요청 을 받 아들 이 는 지 물 어보 고 구체 적 인 매개 변 수 는 다음 그림 과 같 습 니 다.
这里写图片描述
그러나 이 요청 은 쿠키 와 자신 이 정의 한 header 를 휴대 할 수 없습니다.
프로젝트 에 Spring security 가 도입 되 었 기 때문에 제 가 사용 하 는 token 전달 방식 은 header 에서 authorization 필드 를 사용 하 는 것 입 니 다.이렇게 Spring Security 에 의존 하여 preflight request 를 차단 하면 token 을 가지 고 있 지 않 은 것 을 발견 하면 401 을 잘못 보고 하고 권한 이 없습니다.
이 문 제 를 해결 하 는 것 은 매우 간단 하 므 로 아래 설정 을 사용 할 수 있다.
Spring security 가 preflight request 를 검사 하지 않도록 합 니 다.

 @Override
    public void configure(HttpSecurity http) throws Exception {
        ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry 
        = http.authorizeRequests();
        registry.requestMatchers(CorsUtils::isPreFlightRequest).permitAll();// Spring security    preflight request 
    }
다시 시도 하면 됩 니 다.하지만 백 엔 드 에서 크로스 지원 을 직접 설정 하면 두 번 의 요청 이 발생 할 수 있 습 니 다.또 다른 방식 으로 Nginx 로 요청 을 전달 해도 된다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기