2017-03-19 4 views
0

스프링 mvc (휴식), 스프링 보안 (4.x) 및 angular2 어플리케이션이 있습니다. 응용 프로그램은 weblogic에 배포되며 SAML 인증을 담당하므로 내 응용 프로그램이 인증 조각 만 사용하고 있습니다. 그렇게하기 위해 우리는 커스텀 요청 헤더를 검증하는 곳에서 커스텀 요청 헤더 인증 필터를 사용하고 있습니다. 이 모든게 잘 작동합니다.angle2를 가진 스프링 보안은 POST, PUT 및 삭제시 403 금지 된 오류 만 제공합니다.

이제 내 서버가 CSRF 토큰 쿠키를 추가하는 CSRF 보호를 구현하고 있으며 angular2는 모든 후속 요청에서 x-xsrf-token과 동일한 쿠키를 전달하기 때문에 즉시 지원합니다.

여기에서 시작하는 모든 문제는 GET 요청이 정상적으로 작동하지만 POST 또는 PUT 또는 DELETE를 수행 할 때 403 오류가 발생합니다. GET과 POST 요청을 비교해 보면 POST 요청에 "Access-Control-Allow-Headers"가 없다는 것을 알았 기 때문에 서버가이 헤더를 공개해야하므로 브라우저가 POST에 X-XSRF-TOKEN을 보낼 수 있다고 생각합니다./PUT 요청.

동일한 헤더가 GET 요청에 있습니다.

누구나 설명 할 수 있습니까? 그렇다면 전체 응용 프로그램에 대해 봄 secuirty 또는 봄 mvc이 헤더를 어떻게 노출시킬 수 있습니까?

그렇다면이 문제의 원인은 무엇입니까?

<filter> 
    <filter-name>cors</filter-name> 
    <filter-class>com.elm.mb.rest.filters.CORSFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>cors</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 


@Override 
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
    response.addHeader("Access-Control-Allow-Origin", "*"); 

    if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) { 
     LOG.trace("Sending Header...."); 
     // CORS "pre-flight" request 
     response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); 
     response.addHeader("Access-Control-Allow-Headers", "Content-Type,X-XSRF-TOKEN"); 
     response.addHeader("Access-Control-Max-Age", "1"); 
    } 

    filterChain.doFilter(request, response); 
} 
+0

원본 게시물을 참조하십시오. 설정을 추가했습니다. 또한이 필터는 스프링 보안 필터 이전의 모든 요청을 가로 챌 수 있도록 내 스프링 보안 구성의 첫 번째 필터입니다. – user509755

답변

1

당신은 직접 프리 플라이트 요청을 반환해야 config (설정)

내 CORS, 더 here (그리 간단하지 요청)를 참조하십시오.

if (request.getHeader("Access-Control-Request-Method") != null) { 
    LOG.trace("Sending Header...."); 
    // CORS "pre-flight" request 
    response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); 
    response.addHeader("Access-Control-Allow-Headers", "Content-Type,X-XSRF-TOKEN"); 
    response.addHeader("Access-Control-Max-Age", "1"); 
    if ("OPTIONS".equals(request.getMethod())) { 
     return ; 
    } 
}