2015-05-14 68 views
1

問題聲明:我有一些使用spring安全性進行CSRF保護的restful API。此外,這些API將通過Angular WEB UI從不同Origin /域訪問。由於Siteminder處理身份驗證,因此我不需要Spring身份驗證。Spring安全性CSRF CORS

方法: 我跟着從戴夫Syer的CSRF保護此鏈接:The Login Page: Angular JS and Spring Security Part II這是除了一個問題(下)完美的工作。

問題:當我的角度html客戶端訪問同一個origin/domain上的RESTful API時,此代碼工作得很好;但是當我嘗試從不同來源訪問相同的API時,出現403錯誤 - Access Forbidden - CSRF令牌錯誤。

做法,我至今試圖通過擴展您的例子:

  1. 增加了CORS過濾器 - Enabling Cross Origin Requests for a RESTful Web Service

    response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 
    response.setHeader("Access-Control-Max-Age", "3600"); 
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); 
    

以上沒有運氣。

請提出建議,如果我需要做其他事情才能使之有效。

感謝, 網速慢

回答

1

CSRF和CORS是不一樣的東西。您現在可能已經對CORS部件進行了排序,但您需要將CSRF令牌添加到任何POST/PUT/DELETE請求中。 Spring Security在您引用的博客系列中的標題中發送了令牌,並且Angular從中挑選了它(您需要添加幾行代碼才能使其運行)。

+1

非常感謝@Dave Syer!它在從這裏爲客戶端添加幾行角碼之後起作用:[link] https://github.com/pasupulaphani/angular-csrf-cross-domain。此外,在CORS過濾器中添加Access-Control-Allow-Headers:origin,content-type,X-CSRF-TOKEN以使其可以從不同的來源訪問。 訪問控制請求方法:POST – Sum

+0

可以請你發佈什麼你添加到angularjs應用程序,以使其運行?謝謝! – skywalker

+0

請參閱此處的代碼:https://github.com/dsyer/spring-security-angular/blob/master/single/src/main/java/demo/UiApplication.java#L65 –