2010-05-11 150 views
10

自從幾天以來,我使用了GWT 2.0。因此,我嘗試使用登錄表單和只有在登錄時纔可訪問的頁面來編寫基本應用程序。與Spring Security 3.0的GWT 2.0集成

通常在我的web應用程序中使用jsf,例如,我使用Spring Security 3.0來配置和保護那種應用程序。 所以,我決定嘗試用我的GWT 2.0應用程序做同樣的事情。

我已經很好地配置了Spring Security的服務器部分。所以從我的GWT登錄頁面,我可以輸入我的登錄名/密碼,並通過Spring Security進行身份驗證。重定向到受保護的頁面已完成,我可以通過對使用Spring Security的SecurityContext的安全服務的rpc調用來獲取連接的用戶。所以,我認爲這部分是可以的。

但是,我有一個很大的問題,以確保網址。事實上,我想確保頁面能夠限制對特定角色的訪問,就像我通常對Spring Security所做的那樣。

在我的GWT應用程序中,我使用中央應用程序控制器的MVP模式。所以,我只有一個頁面,並且在該頁面的末尾添加#name_of_view時,我將會看到不同的視圖。例如,要以開發模式訪問我的登錄頁面,我在瀏覽器上使用以下URL:

http:// 127.0.0.1:8888/fr.myapp.Application/Application.html?gwt.codesvr= 127.0.0.1:9997#login

一旦我正在正確的方式記錄,我要去下面的觀點:

的http:// 127.0.0.1:8888/fr.myapp.Application/Application.html? gwt.codesvr = 127.0.0.1:9997#pagesecured

因此,我不知道如何在Spring Security中配置http標記以及如何定義攔截URL以影響它們的特定角色來限制訪問。 此外,我認爲在開發模式和經典生產模式之間使用這些URL會有問題。不是?

那麼,有人會有任何想法來幫助我使用這些URL配置和保護我的應用程序?或者通過使用其他技術來保護表單登錄的應用程序?

非常感謝您的幫助。

Sylvain。

回答

8

在這種情況下,您無法使用頁面級安全性,因爲您的視圖正在客戶端進行更改。

在這種應用程序中實現基於角色的安全性的唯一方法是在服務器端代碼中使用method-level security。您還可以通過創建特定的非GWT登錄頁面(例如,Login.html)來限制未經身份驗證的用戶訪問您的Application.html

5

同意@axtavt - 通常,您不能在GWT中使用頁面級別的安全性,因爲就彈簧安全性而言,它只是一個頁面。

你應該做到以下幾點 -

  1. 保護您的RPC的網址。如果需要,您可以使用方法級別的安全性,如axtavt指出的那樣。要將RPC與Spring Security掛鉤,請覆蓋RPC Servlet中的onAfterRequestDeserialized(RPCRequest)方法。方法RPCRequest具有關於正在調用的方法以及正在傳遞給該方法的實際參數的詳細信息。該信息足以防止一個用戶更新另一個用戶的記錄。

  2. 如果RPC服務中存在身份驗證或授權錯誤,請輸出適當的錯誤並將其發送給客戶端。在您的客戶端中,創建一個centralized error handler並向用戶顯示相應的消息。

  3. 最後,除了spring安全性外,您可能還想保護自己免受XSS和CSRF的攻擊。有關更多信息,請參閱Security for GWT Applications

1

您可以使用頁面級安全性,因爲您的GWT模塊可以使用rustyshelf在此處描述的方法由兩個頁面共享:Problem with multiple entry Points in the same module

總結:

  1. 創建頁面,例如Login.html僅使用令牌登錄,允許任何人訪問它,例如它應該包含一個帶ID登錄的div標籤。
  2. 使用Application.html,帶有ID應用程序的div標籤,該標籤將用於所有其他應用程序,並確保它不允許使用登錄標記並拒絕訪問任何未經身份驗證的用戶。
  3. 讓您的GWT模塊根據頁面上的div標籤加載適當的視圖。

每個HTML文件中的div應該用來確定要顯示哪個HTML頁面(在onModuleLoad中),但是應該刪除div,因爲應用程序的其他部分不應該被刪除依靠div的存在。

您還應該使用method security來保護您的RPC,因爲上面只會保護大多數應用程序可以使用的URL。