2013-09-23 28 views
4

只是想知道我的後續身份驗證方法是否正確。是否有缺陷或缺失?建議和討論非常受歡迎。GWT身份驗證和用戶信息訪問

1>用戶提供用戶名和密碼,並通過RPC發送到服務器。與存儲在數據庫中的哈希值相比較。

2>假設用戶名和密碼是準確的,Auth令牌保存在會話中。訪問servlet時會檢查身份驗證令牌。

3>用戶id(整數)通過RPC onSuccess返回給客戶端。用戶標識保存在客戶端的靜態變量中。

4>每當需要用戶特定信息時,帶有用戶id(靜態變量)的rpc調用將被髮送到服務器以供數據庫查詢。

感謝

+0

也看看http://stackoverflow.com/questions/2974100/question-on-gwt-cookies-and-webpage-directing/2976062#2976062 – drafael

回答

0

你報

3>用戶識別碼(整數)返回到通過RPC的onSuccess客戶端。用戶標識保存在客戶端的靜態變量中。

如果用戶刷新他的頁面,存儲在客戶端靜態字段中的值將被重置,對吧?在這種情況下會議結束了嗎?用戶將被提示再次登錄?

+0

是的,它是什麼。 –

2

您最好將令牌返回給客戶端,並驗證令牌而不是用戶標識。 如果使用用戶ID,則用戶A登錄,則另一個用戶可以向服務器發送請求,假裝爲用戶A.您的身份驗證方法無法保護數據。

+0

然後,servlet將檢查會話和會話中的令牌以驗證數據訪問。 –

2

您不需要發送用戶標識到客戶端。服務器已經有了他需要的所有信息來識別用戶。

這段代碼創建一個會話cookie,與session.getId()你得到它的內容,你應該保存識別用戶:

HttpServletRequest request = this.getThreadLocalRequest(); 
HttpSession session = request.getSession(true); 

然後,當用戶調用你的服務器,你只要讀回會話ID。

HttpServletRequest request = this.getThreadLocalRequest(); 
HttpSession session = request.getSession(false); 

隨着session.invalidate()你可以摧毀會話,它也可以store objects會話。

this.getThreadLocalRequest()只適用於* Impl。

+0

是的,你是對的。您可以通過這種方式識別會話。但是,我有一個關於訪問mysql中的數據的問題。所有數據都有一列作爲用戶標識。我需要通過此用戶標識查詢相關數據。如何將會話ID與用戶ID關聯起來? –

+0

您可以將會話標識映射到新表中的用戶標識。這也將保持會話ID和用戶ID分離。此外,如果用戶ID始終是一個用戶相同,我不會建議將其存儲在會話中。 – Akkusativobjekt

+0

是的,這是一個更好的主意。所以建立一個新的表來關聯sessionId(變量)和用戶id(常量)。但是,在客戶端保留userId作爲靜態變量還有什麼缺陷,因爲會話將在訪問servlet時再次檢查? –