2011-02-12 27 views
24

我正在開始一個新項目,我們正在計劃構建一個平靜的後端和一個AJAX字體結尾。我將重點放在識別所有我擁有的資源以及各種HTTP動詞做什麼,它們的URI以及這些資源的JSON表示方式上來解決這個問題。如何爲REST後端/ Ajax設計認證和授權系統前端應用程序

我正在尋找確保後端的最佳設計。這是我考慮的設計清單。我正在尋找下面未列出的替代設計,以及優點,缺點建議。該系統將在Spring 3.0和Spring Security 3.0中實現,SSL將用於系統的許多部分,但不適用於所有的部分,所以一些請求可能來自SSL,有些可能不會。

選項1:使用HTTP會話

顯示標準的登錄屏幕,創建一個服務器端的會話,並讓Tomcat發回一個JSESSIONID cookie,並具有Ajax客戶端包括在每一個XHR請求JSESSIONID的cookie。由於以下原因,這個選項只是感覺是錯誤的。

  • 的連接成爲全狀態這是對REST的規則
  • 我希望能夠分裂bakcend成多個獨立的WAR文件,這意味着我可以對後臺多個HTTP會話,如果是這樣的那麼這種方法不起作用。儘管我不需要今天將後端分割爲多個應用程序的能力,但我更願意採用允許這種可能性的設計。

選項2:找到一個開源的基於Java的安全庫,這是否

除了春季安全我還沒有發現任何其他的Java類庫,任何建議高度讚賞。

方案3:儘量使用現有協議OAuth的一樣

在我在的OAuth非常簡單瞭解一下它似乎是專爲跨站點驗證,其中每個站點都有它自己的用戶數據庫。在這個系統中,我想要一個跨所有後端ajax服務共享的全局用戶數據庫。

選擇4:利用SAML和Shiboleth

此選項似乎超必殺以及非常複雜的設置和維護。

選項5:每個請求發送的用戶名和密碼

這需要用戶發送他們的用戶名和密碼與每個請求,這意味着前端AJAX應用必須存儲爲JavaScript對象的用戶名和密碼並且如果用戶離開頁面,則返回用戶名/密碼組合將會消失,並且用戶可能被迫再次登錄。我不希望前端嘗試將用戶名和密碼放入cookie中,因爲這將包含安全性。

選項6:實現自己的身份驗證/授權協議

創建一個REST服務,用戶可以提出自己的用戶名/密碼組合,然後回來和安全令牌,他們必須發回給服務每請求。安全令牌將由服務進行數字簽名並具有到期時間。該令牌只適用於大多數操作,高安全性操作需要新的登錄屏幕作爲確認操作的端口。

這種方法的問題是我不得不發明另一種安全協議,這看起來像是浪費時間。

我相信我不是唯一一個反對這個問題的人,我希望堆棧溢出社區可以指向一些我還沒有找到的選項和工具。

回答

9

看看Apache Shiro。它是一個具有會話管理功能的身份驗證系統,可用於跨應用程序共享會話。這可能是最容易做的事情。

或者你可以使用Spring Security(或Shiro)和一個在Web應用程序之間共享的Remember Me cookie(只要它們在同一個HTTP域中)。記住我的cookie將與選項6中的令牌類似。您可以在cookie上設置過期時間,以便像會話cookie一樣短暫地存活,或像定期記住我一樣長期存活。

+0

感謝您指出了Apache Shiro,我以前沒有聽說過它。 – ams 2011-02-14 04:46:41

1

您可能還想看看Jasig CAS-- Web上的單點登錄。它有一個REST API和一個允許服務代理用戶AuthN到後端服務的協議(代理票證),就像選項6中所述。http://www.jasig.org/cas

簡而言之...提供AJAX客戶端的應用程序受Spring保護安全性(開箱即用支持CAS)並獲取您嵌入AJAX客戶端的代理授權票證。 AJAX客戶端使用PGT爲您的REST服務獲取代理票據......也受到Spring Security的保護。 REST服務獲得經過身份驗證的用戶標識,但沒有每個接觸的主憑證。

或者,您可以將PGT保留在服務器上,並使用AJAX調用來檢索代理票證,然後由AJAX客戶端使用它來調用您的REST服務。

2

我瞭解你要確保其他應用,前言您必須知道的三個概念(3A)安全提供consisd: -Authentication -Authorization - 審覈

實現這三個同時必須提供一堆工具,如: -SSO提供商 -Session商店 - 開放式身份識別碼 - 用戶憑據集成 ....

我已經使用ACL(訪問控制列表春季)提供授權服務和oauth2進行身份驗證。 有一個通道將這兩者連接在一起,並將其範圍(oauth2作用域)連接起來,但問題在於作用域不夠靈活(純字符串)足以實現授權模塊,如role_voter,cache_strategy,black_list或Role_base策略,例外權限,white_list ...(但你可以使用@EnableGlobalMethodSecurity)

在我的情況下,我使用授權服務器作爲oauth2身份驗證服務器的資源(看看http://projects.spring.io/spring-security-oauth/docs/oauth2.html),然後我考慮了兩個位置來檢查授權,第一個我發佈ACL到前端,強制程序員根據ACL概念動態設計她的頁面,第二個是在服務層(BLL)的後端使用Aspect,當一個休息將被調用時。我將服務密鑰作爲actee發送,以檢查當前用戶是否有足夠的訪問控制權來執行此操作。並審計您必須監視所有請求,我的意思是你必須在你的網關或經紀人使用一個監聽器...

相關問題