SpringBoot+Spring Security 는 도 메 인 을 뛰 어 넘 는 해결 방안 을 실현 할 수 없습니다.
5203 단어 SpringBootSpringSecurity크로스 필드
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 로 요청 을 전달 해도 된다.이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.