[SPRING] 스프링 부트에서 허용 된 헤더를 변경하는 방법
SPRING스프링 부트에서 허용 된 헤더를 변경하는 방법
저는 현재 Auth0 (그리고 Angular 2 GUI)을 사용하고 있습니다.이 API는 요청시 "x-xsrf-token"유형의 헤더를 Spring Boot API에 보냅니다.
오류가 발생했습니다.
응답 헤더의 Access-Control-Response-Headers 목록에 x-xsrf-token이 포함되어 있지 않기 때문에 (Chrome의 네트워크 탭에 요청을 디버깅 할 때)이 정도면 충분합니다.
몇 가지 해결책을 시도해 보았습니다. 가장 가까운 곳은 AppConfig의 configure 메소드를 재정의 (override)하고 다음과 같이 자신의 CorsFilter를 추가하는 것입니다.
(Imports removed for brevity)
@Configuration
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class AppConfig extends Auth0SecurityConfig {
@Bean
public Auth0Client auth0Client() {
return new Auth0Client(clientId, issuer);
}
@Bean
public Filter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("Content-Type");
config.addAllowedHeader("x-xsrf-token");
config.addAllowedHeader("Authorization");
config.addAllowedHeader("Access-Control-Allow-Headers");
config.addAllowedHeader("Origin");
config.addAllowedHeader("Accept");
config.addAllowedHeader("X-Requested-With");
config.addAllowedHeader("Access-Control-Request-Method");
config.addAllowedHeader("Access-Control-Request-Headers");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
@Override
protected void authorizeRequests(final HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/ping").permitAll().antMatchers("/").permitAll().anyRequest()
.authenticated();
}
String getAuthorityStrategy() {
return super.authorityStrategy;
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.csrf().disable();
http.addFilterAfter(auth0AuthenticationFilter(auth0AuthenticationEntryPoint()),
SecurityContextPersistenceFilter.class)
.addFilterBefore(simpleCORSFilter(), Auth0AuthenticationFilter.class);
authorizeRequests(http);http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.cors();
}
}
불행히도 나는 이것으로 아무런 성공을 거두지 못했고 x-xsrf-token이 get 요청의 응답 헤더에 없다는 것을 여전히 볼 수 있습니다.
내 기본 프로젝트는 다음과 같습니다. https://github.com/auth0-samples/auth0-spring-security-api-sample/tree/master/01-Authentication/src/main
어떤 아이디어라도 환영합니다.
해결법
-
==============================
1.당신이 여기서 게시 한 이슈에 관해서는 이미 논의 중에 있다고 생각합니다. 그러나 당신이 여기서도 질문을 제기했기 때문에 SOF에 답할만한 가치가 있다고 생각했습니다.
당신이 여기서 게시 한 이슈에 관해서는 이미 논의 중에 있다고 생각합니다. 그러나 당신이 여기서도 질문을 제기했기 때문에 SOF에 답할만한 가치가 있다고 생각했습니다.
할 수있는 일은 자신의 업데이트 된 CORS 필터 구현으로 기본 라이브러리 설정의 CORS 필터 설정을 무시하도록 AppConfig를 수정하는 것입니다
귀하의 경우,이 줄에 x-xsrf-token을 추가하는 것일 수도 있습니다.
response.setHeader("Access-Control-Allow-Headers", "Authorization, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, " + "Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
그러나 위의 링크 된 github 문제에서 언급했듯이, HAR 파일을 보내 주시면이 사실이 맞는지 확인할 수 있으며 작업 솔루션을 제공합니다.
-
==============================
2.시험,
시험,
@Bean public FilterRegistrationBean corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); source.registerCorsConfiguration("/**", config); FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); bean.setOrder(0); return bean; }
https://spring.io/blog/2015/06/08/cors-support-in-spring-framework
-
==============================
3.궁극적으로 나는 이것을 나 자신으로 해결했다. pom.xml 파일에서이 종속성을 제거했습니다.
궁극적으로 나는 이것을 나 자신으로 해결했다. pom.xml 파일에서이 종속성을 제거했습니다.
<dependency> <groupId>com.auth0</groupId> <artifactId>auth0-spring-security-api</artifactId> <version>0.3.1</version> </dependency>
github의 오픈 소스 프로젝트이기 때문에 여기 https://github.com/auth0/auth0-spring-security-api를 방문하십시오. 내 프로젝트의 소스 코드를 자체 패키지에 추가하고 pom.xml 파일에 종속성을 추가했습니다. 그런 다음 Auth0CORSFilter의 doFilter 메소드를 x-xsrf-token을 포함하도록 변경했습니다.
@Override public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException { final HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Authorization, x-xsrf-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, " + "Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"); chain.doFilter(req, res); }
불행하게도 필자는 필요한 경우 쉽게 버전을 전환 할 수 없으며, 약간 더 복잡한 코드베이스를 가지고 있습니다. 그러나 Spring을 처음 접했을 때 Auth0CORSFilter Bean을 재정의하려는 시간보다 훨씬 쉬웠습니다. 그것은 가능했습니다.
from https://stackoverflow.com/questions/40202908/how-to-alter-allowed-headers-in-spring-boot by cc-by-sa and MIT license