복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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을 재정의하려는 시간보다 훨씬 쉬웠습니다. 그것은 가능했습니다.

  4. from https://stackoverflow.com/questions/40202908/how-to-alter-allowed-headers-in-spring-boot by cc-by-sa and MIT license