2017-03-19 75 views
0

我有彈簧mvc(其他),彈簧安全(4.x)和angular2應用程序。應用程序部署在weblogic中,它負責SAML身份驗證,因此我的應用程序僅使用授權部分。要做到這一點,我們使用自定義請求標頭認證過濾器,我們驗證自定義請求標頭,並基於它從具有授予權限的數據庫加載用戶。所有這些工作正常。彈簧安全與angular2給403禁止錯誤只在POST,PUT和刪除

現在我正在實施CSRF保護,其中我的服務器正在添加CSRF令牌cookie,並且由於angular2具有開箱即用的支持,因此它將在所有後續請求上傳遞與x-xsrf令牌相同的cookie。

問題從這裏開始,所有GET請求都正常工作,但是當我的應用程序執行POST或PUT或DELETE時,出現403錯誤。比較GET和POST請求,我注意到POST請求沒有「Access-Control-Allow-Headers」,所以我想我的服務器不得不公開這個頭文件,以便瀏覽器可以發送X-XSRF-TOKEN到POST/PUT請求。

GET請求中存在相同的標題。

任何人都可以解釋我在正確的軌道上嗎?如果是的話,那麼我怎樣才能公開這個標題在春季安全或彈簧mvc整個應用程序?

如果不是那麼是什麼原因導致這個問題?

我CORS配置

<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

請看我原來的帖子,我已經添加了cors config。而且這個過濾器是我的spring安全配置中的第一個,因此它可以在spring安全過濾器之前攔截所有的請求。 – user509755

回答

1

您應該直接返回預檢要求,更見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 ; 
    } 
}