6

我有一個Spring MVC應用程序,它使用Spring Security來處理用戶登錄驗證,這很好地工作。如何保護Angular.js或Ember.js的Spring REST風格的webservice

現在我想一些Ember.js和Angular.js代碼添加到訪問春RESTful Web服務(這只是返回JSON數據)的HTML頁面。

如何將用戶登錄身份驗證綁定到REST式Web服務的身份驗證?換句話說,我想讓它成爲只有用戶登錄後才能訪問REST風格的Web服務。這樣,Angular.js和Ember.js庫就可以從我的用戶頁面安全地訪問這些REST風格的Web服務沒有其他人能夠直接打電話給他們。

我在另外一個帖子讀取春季安全從來就不是一個完整的Ajax框架中使用,是真的嗎?我希望事實並非如此。我想現在這種類型的事情一定很常見,因爲有很多基於訪問JSON/RESTful API的AJAX客戶端框架。

回答

11

Spring Security從來不打算或不能在AJAX應用程序中使用。我有兩個使用Spring Security的應用程序,以及使用相同組合的AJAX和更多正在開發的應用程序。

如果你要使用EmberJS或AngularJS與春季安全工作的現有Web應用程序,你應該不會面臨太多的問題,如果你只是JavaScript庫添加到項目中。這是因爲一旦用戶通過身份驗證,任何正常的HTTP請求都將被視爲已驗證身份,因爲瀏覽器將確保會話信息根據需要使用Cookie或URL參數來回傳遞。你可以看到我的一個working examples on Github用於Spring Security和EmberJS集成。

您可能需要擔心的唯一的事情的是CSRF令牌使用AJAX表單提交。最新的Spring Security文檔有一小部分專用於此,所以您不應該面臨太多的問題。不過,我想澄清一下,這個特殊問題並不特定於Spring Security。 CSRF保護通常涉及在每個HTTP POST請求中包含一個安全的隨機生成的令牌。面臨的挑戰來自於讓現有的JavaScript庫知道這個令牌以及它應該如何包含在HTTP POST請求中。這對任何應用程序都是一個挑戰,而不僅僅是那些使用Spring Security的應用程序。

如果您將與無狀態客戶端(例如移動設備)一起工作,您將無法依賴將HTTP用戶憑證存儲在HTTP Session中的默認Spring Security機制,因爲HTTP請求不會將信息綁定到會議。這又不是特定於Spring或Spring Security應用程序,因爲約束是由客戶端和客戶端 - 服務器通信的性質強加的,而不是任何服務器端技術。在這種情況下,您需要在應用程序的HTTP標頭中傳遞一些身份驗證令牌,以維護服務器端的安全狀態。我有一個working example for this as well。如果你需要更多的細節,網上有文章解釋瞭如何用Spring Security做這樣的事情。

相關問題