2010-09-29 112 views
2

我有一個基於GWT的應用程序。我想添加訪問控制。有沒有辦法爲GWT組件添加自定義訪問控制?在基於GWT的應用程序中添加訪問控制

我對增加訪問控制/權限的想法如下。

  1. 向需要添加訪問控制的類(GWT組件)添加訪問控制註釋(如果存在的話)。
  2. 當這個組件被渲染時,我的自定義方法檢查訪問控制規則被調用,並根據它的結果組件被渲染。

關於如何實現這一點的任何想法。

+0

重複http://stackoverflow.com/questions/3184981/design-patterns-for-enabling-user-interface-elements-based-on-user-permissions - 總之,使用裝飾模式。 – 2010-09-29 13:41:40

+0

我已經通過該線程,但無法找到它在我的情況有用。我嘗試使用裝飾器模式將訪問控制添加到Widget類的GWT中,但Widget類不公開它的生命週期方法(onAttach,onLoad等),在那裏我可以連接我的自定義邏輯。 – 2010-09-29 19:08:47

回答

3

在一個GWT應用程序中,我已經完成訪問控制兩種方式,都假設訪問控制在服務器上執行 - 在每個AJAX(GWT RPC)調用中。 JavaScript方面本質上是不安全的,所以任何控制都是毫無意義的。

根據我所需要的細粒度訪問控制的方式,我通過保護GWT RPC端點的servlet容器使用了基於URL的控制。即

/public/gwt.rpc.endpoint 
/private/gwt.rpc.endpoint 

使用bog標準web.xml或spring安全性來保護私有文件。然而這導致我在啓動GWT應用程序之前處理登錄「正常」基於表單的方式。

更細粒度的方法是對每一個GWT RPC暴露方法使用異常:

interface MyService extends RemoteService { 
    SomeData getPublicData(); 
    SomeSecret getPrivateData() throws AccessDeniedException; 
    Result login(String username, String password); 
} 

interface MyServiceAsync { 
    void getPublicData(AsyncCallback<SomeData> callback); 
    void getPrivateData(AsyncCallback<SomeSecret> callback); 
    void login(String username, String password, AsyncCallback<Result> callback); 
} 

通過使AccessDeniedException異常RPC序列化,我將獲得在AsyncCallback的是例外 - 這使得扔在GWT應用程序中創建一個登錄對話框。

然而,實際的登錄調用和服務器端會話處理我完全手動完成,不依賴於任何框架(儘管您可以使用Spring Security來完成)。

相關問題