programing

스프링 데이터 받침대 및 Cors

powerit 2023. 7. 27. 22:26
반응형

스프링 데이터 받침대 및 Cors

저는 Rest 인터페이스와 다트가 전면에 있는 Spring Boot 애플리케이션을 개발하고 있습니다.

XMLHttpRequest는 완전히 올바른 OPTIONS 요청을 실행합니다.이 후 최종 GET("/제품") 요청이 실행되고 실패합니다.

요청한 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다.따라서 오리진 'http://localhost:63343'에 액세스할 수 없습니다.

디버깅한 결과 다음과 같은 것을 발견했습니다.AbstractHandlerMapping.corsConfiguration은 RepositoryRestHandlerMapping을 제외한 모든 하위 클래스에 대해 채워집니다.RepositoryRestHandler Mapping에는 생성 시 corsConfiguration이 없으므로 cors 경로/리소스로 인식되지 않습니다.
=> CORS 헤더가 부착되지 않음
그게 문제일까요?어떻게 설정해야 하나요?

구성 클래스:

@Configuration
public class RestConfiguration extends RepositoryRestMvcConfiguration {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowCredentials(false).allowedOrigins("*").allowedMethods("PUT", "POST", "GET", "OPTIONS", "DELETE").exposedHeaders("Authorization", "Content-Type");
    }

   ...
}

저는 심지어 주석당 코르스를 설정하려고 했습니다.

@CrossOrigin( methods = RequestMethod.GET, allowCredentials = "false")
public interface ProductRepository extends CrudRepository<Product, String> {


}

원시 요청 헤더:

GET /products HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
authorization: Basic dXNlcjpwYXNzd29yZA==
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.130 Chrome/43.0.2357.130 Safari/537.36
Content-Type: application/json
Accept: */*
Referer: http://localhost:63343/inventory-web/web/index.html
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4

원시 응답 헤더:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Thu, 30 Jul 2015 15:58:03 GMT

사용된 버전: Spring Boot 1.3.0.M2 스프링 4.2.0.RC2

뭐가 그리울까요?

실제로 Spring Data REST 2.6(Ingalls) 이전 버전만HandlerMappingSpring MVC에서 생성한 인스턴스WebMvcConfigurationSupport및 컨트롤러에 주석을 달았습니다.@CrossOriginCORS가 알고 있었습니다.

하지만 이제 DATAREST-573이 수정되었으니,RepositoryRestConfiguration이제 a를 공개합니다.getCorsRegistry()글로벌 설정 및@CrossOrigin저장소의 주석도 인식되므로 이 방법을 사용하는 것이 좋습니다.구체적인 예는 https://stackoverflow.com/a/42403956/1092077 답변을 참조하십시오.

Spring Data REST 2.5(Hopper) 또는 이전 버전을 고수해야 하는 사람들에게는 필터 기반 접근 방식을 사용하는 것이 가장 좋은 해결책이라고 생각합니다.분명히 Tomcat, Jetty 또는 이것을 사용할 수 있지만 Spring Framework 4.2는 또한 다음과 같은 CORS 처리 로직을 사용하는 것을 제공합니다.@CrossOrigin그리고.addCorsMappings(CorsRegistry registry)접근법인스턴스를 에 전달함으로써CorsFilter생성자 매개 변수, 스프링 네이티브 CORS 글로벌 지원만큼 강력한 것을 쉽게 얻을 수 있습니다.

Spring Boot을 사용하는 경우(지원하는 Spring Boot)Filter콩), 다음과 같은 것일 수 있습니다.

@Configuration
public class RestConfiguration {

    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration().applyPermitDefaultValues();
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        return bean;
    }
}

Ingalls 트레인이 실현된 이후, Spring Data에서 CORS의 지원이 시작되었습니다.두 가지 방법으로 처리할 수 있습니다.

  1. @CrossOrigin주및 지한주를 origins,methods,그리고.allowedHeaders1파운드를 @RepositoryRestResourceinterface 이름

    @CrossOrigin(...)
    @RepositoryRestResource
    public interface PageRepository extends CrudRepository<Page, Long> { ... }
    
  2. 를 한 글로벌 입니다.RepositoryRestConfiguration富士山의 @Configurationclass.를 합니다. 기준으로 리포지토리 표시@CrossOrigin그럴 필요는 없습니다.

    @Configuration
    public class GlobalRepositoryRestConfigurer extends RepositoryRestConfigurerAdapter {
    
        @Override
        public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
            config.getCorsRegistry()
                      .addMapping(CORS_BASE_PATTERN)
                      .allowedOrigins(ALLOWED_ORIGINS)
                      .allowedHeaders(ALLOWED_HEADERS)
                      .allowedMethods(ALLOWED_METHODS);
         }
    
    }
    

어떤 이유에서인지 Spring Boot 1.5.2에서 1.5.6으로 업그레이드한 후 위의 승인된 답변에서 제시된 접근 방식은 저에게 효과가 없었습니다.

@BigDong의 코멘트에서도 지적되었듯이, 제가 받은 예외는 다음과 같습니다.

빈 인스턴스화예외:[javax.servlet]을(를) 인스턴스화하지 못했습니다.필터]:공장 메서드 'springSecurityFilterChain'에서 예외를 발생시켰습니다. 중첩 예외는 org.springframework입니다.콩 공장BeanNotOfRequiredTypeException: 'corsFilter'라는 이름의 Bean은 'org.springframework.web.filter' 유형이어야 합니다.CorsFilter'이지만 실제로는 'org.springframework.boot.web.servlet' 유형입니다.필터 등록 빈

Spring Data Rest 또는 Spring MVC를 사용하여 구현되고 모든 엔드포인트가 Spring Security에 의해 보호되는지 여부에 관계없이 REST API의 모든 엔드포인트에 대해 "글로벌" CORS 구성을 구현하기 위해 다음과 같이 생각했습니다.

를 할 수 CorsFilter시점에 했습니다. 하여 SDR과 MVC를 설정했습니다. 그러나 동일한 구성을 사용합니다.CorsRegistry도우미를 합니다.

public static void applyFullCorsAllowedPolicy(CorsRegistry registry) {
    registry.addMapping("/**") //
            .allowedOrigins("*") //
            .allowedMethods("OPTIONS", "HEAD", "GET", "PUT", "POST", "DELETE", "PATCH") //
            .allowedHeaders("*") //
            .exposedHeaders("WWW-Authenticate") //
            .allowCredentials(true)
            .maxAge(TimeUnit.DAYS.toSeconds(1));
}

그리고 MVC의 경우:

@Configuration
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class CustomWebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // enables CORS as per
        // https://docs.spring.io/spring-security/site/docs/current/reference/html/cors.html#cors
        http.cors()
            .and() // ...
    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                applyFullCorsAllowedPolicy(registry);
            }
        };
    }
}

SDR의 경우:

public class CustomRepositoryRestMvcConfiguration extends RepositoryRestConfigurerAdapter {

@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    config.setReturnBodyOnCreate(true);
    config.setReturnBodyForPutAndPost(true);
    config.setReturnBodyOnUpdate(true);
    config.setMaxPageSize(250);
    config.setDefaultPageSize(50);
    config.setDefaultMediaType(MediaTypes.HAL_JSON);
    config.useHalAsDefaultJsonMediaType(true);

    CustomWebSecurityConfiguration.applyFullCorsAllowedPolicy(config.getCorsRegistry());
}

다음은 제가 다음과 같은 답을 도출하는 데 도움이 된 주제에 대한 추가 참조입니다.

RepositoryRestConfigurerAdapter는 3.1에서 더 이상 사용되지 않으므로 위의 스프링 부트 및 데이터-레스트 버전 3.1을 사용한 경우 RepositoryRestConfigurer를 직접 구현할 수 있습니다.

@Configuration
public class ConfigRepositoryRest implements RepositoryRestConfigurer {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    config.getCorsRegistry()
            .addMapping("/**")
            .allowedOrigins("http://localhost:3000");
}

}

저는 스프링 휴게소를 각진 곳에서 치려고 했습니다.Tomcat 서버에 배치된 스프링 레스트 프로젝트이며 각도가 기본 각도 서버입니다.저는 이 문제가 각진 부분에서 서비스 부분까지 영향을 미칠 때 직면했습니다.나는 따르려고 노력했습니다.

https://juristr.com/blog/2016/11/configure-proxy-api-angular-cli/

하지만 여전히 문제가 있습니다.선배인 Abbasbhai 덕분에 스프링 구성 파일에 구성을 추가하여 이 문제를 방지할 것을 제안하여 스프링 구성에 이 코드를 추가했습니다.

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
@ComponentScan("org.liferayasif.backend")
public class RestConfig extends WebMvcConfigurerAdapter{

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){
        configurer.enable();
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistry)
     * To avoid 'Access-Control-Allow-Origin'
     * Above error arising when I am hitting from angular to our rest service
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }

}

이 방법은 '액세스-컨트롤-오리진 허용' 코르스를 해결했습니다.

@Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }

참고로 전체 프로젝트를 다운로드할 수 있습니다.

내 github URL 링크:

https://github.com/asifaftab87/SpringPersistenceHibernate

지점 - 보안

프로젝트 - 모델

언급URL : https://stackoverflow.com/questions/31724994/spring-data-rest-and-cors

반응형