2013-08-06 34 views
0

我們有一個ViewRecordScreen我們Tapestry5應用程序與URL:掛毯5 URL操作

http://host:8080/app/viewRecord 

要查看我們的搜索屏幕上,您只需點擊頁面鏈接的記錄。但是,如果你右擊鏈接並選擇「複製鏈接地址」你:

http://host:8080/app/searchresults:viewRecord/12345678 

我現在就可以通過更新ID查看其他記錄操作該網址。什麼是防止在Tapestry 5中進行URL操作的最佳方式(我假設我將不得不編寫一些服務器端驗證代碼,但是我希望Tapestry可能會有一些我不知道的東西可能會有所幫助)。

在此先感謝。

回答

2

的與任何應用程序,安全性是開發者的責任。你不能相信一個URL,你應該始終確保用戶有權查看/編輯一個實體,而不是盲目地讓他們這樣做,因爲URL是這樣說的。如您所知,Tapestry可以使用ValueEncoder s自動在客戶端字符串和服務器端對象之間進行轉換。如果您使用tapestry-hibernate,它會自動爲您的所有實體創建ValueEncoders。然後,您可以在服務器端使用實體作爲激活上下文或事件上下文,tapestry將根據該id生成URL。

如果您希望攔截從字符串到服務器端對象的強制轉換,您可能需要用自己的自定義安全檢查修飾ValueEncoderSource。這很可能會從會話中查找登錄的用戶。

我個人認爲,你不應該裝點ValueEncoderSource。你應該有獲取和更新實體的服務。這些服務應該將User對象作爲參數,並在獲取/更新之前進行驗證。用戶可以從您的頁面/組件中通過服務層的會話中查找。

如:

public interface FooService { 
    public Foo[] getAllFoos(User user); 
    public Result updateFoo(User user, Foo foo); 
    public Result createFoo(User user, Foo foo); 
} 
+0

謝謝您的回答。進一步調查各種方法後,這似乎是最好的方法。 – Airomega

0

我認爲處理它是保持用戶的軌跡的最好方法有權限做這個動作。所以在方法視圖記錄中,你可以檢查用戶是否登錄或類似的東西。如果不是,你不執行該操作。您可以使用會話狀態用於跟蹤用戶狀態(http://tapestry.apache.org/session-storage.html