2014-10-17 39 views
2

我們有一個使用Google App Engine作爲後端的身份驗證系統。底層語言和框架由Java,JDO,Google認證& Google App Engine組成。如何防止Google App Engine中的重複值/身份驗證過程中最終一致的數據存儲

我們有一個用戶實體。用戶實體是用戶從Google App Engine身份驗證響應中保存的元數據(例如:名字,姓氏,電子郵件地址)。

當用戶嘗試註冊或登錄(兩個登錄事件)時,我們掃描數據存儲以查看具有相同電子郵件地址的用戶是否已存在。如果用戶不存在,我們創建一個新用戶。如果用戶確實存在,我們更新並檢索他們的用戶信息,然後檢索他們的應用程序數據。

我們需要運行單獨的多個事務,因爲登錄頁面完全獨立於應用程序頁面。

在某些情況下,當用戶嘗試在短時間內註冊兩次時,會創建一個重複的用戶。雖然我們總是可以獲取註冊的最後一個用戶,但我們確實希望查詢成爲唯一的JDO查詢。由於找到了兩個相同的值(用於用戶的電子郵件地址),所以使用唯一的JDO查詢,JDO查詢(在事務內部運行)有時會失敗。

我們認爲通過以下方式強制約束:

  1. 存儲新註冊用戶在緩存信息。我們似乎沒有發現任何暗示緩存將是防止重複的合適解決方案的信息。緩存是否可以跨計算機即時使用即使是這樣,高速緩存可能因各種原因而彈出一個實體。
  2. 在會話中存儲用戶的電子郵件。這似乎使代碼膨脹,似乎是一種強制約束的奇怪方式。

是否存在Google App Engine的最佳實踐方法,以防止在身份驗證工作流程中出現重複值以及單獨的事務?

回答

4

我會推薦這兩種方法的結合:

  1. 創建一個登錄實體,它由一個主用戶實體的用戶的電子郵件和id的。使用戶的電子郵件成爲登錄實體的關鍵。這確保了它的獨特性。

額外的好處是您可以將多個電子郵件地址鏈接到同一用戶實體。 (我們的應用程序中有這個選項作爲功能)。

另一個額外的好處是:您可以用get()來代替您的登錄查詢,因爲您可以通過電子郵件地址創建密鑰。這樣更便宜,速度更快,並且避免了最終的一致性問題(獲取呼叫總是一致的)。

  1. 在會話中存儲電子郵件地址(甚至是簡單的「登錄」標誌)。只有3-5行代碼才能添加,並在每次登錄嘗試時檢查它,所以我不會稱之爲「膨脹」。

在我的應用我想補充一個標誌,會話和檢查每次調用App Engine的情況下,這標誌(不僅登錄電話,但額外的安全性的所有呼叫),然後驗證會話當用戶登錄出。

+0

嗨安德烈,爲了澄清關於1,你建議使用keyfactory.createkey只有電子郵件地址作爲關鍵值? – 2014-10-17 19:36:55

+0

是的。然後你調用'get',你得到一個現有的記錄或者EntityNotFoundException。 – 2014-10-17 19:42:36

相關問題