2012-08-17 47 views
0

我正在運行Google App Engine項目,其中每當用戶採取某個操作時我都要檢查用戶是否1)已登錄2)管理員。這是我對APPUSER代碼:如何確定用戶是否已在另一個頁面上註銷

class AppUser 
{ 
    private UserService userService; 
    private User user; 

    public AppUser() 
    { 
     userService = UserServiceFactory.getUserService(); 
     user = userService.getCurrentUser(); 
    } 

    public IsAdministrator() 
    { 
     if(IsLoggedIn()) 
     { 
      return userService.IsUserAdmin(); 
     } 
     return false; 
    } 

    public IsLoggedIn() 
    { 
     return user == null; 
    } 
} 

當我退出與我的應用程序能正常工作。但是,如果我註銷另一個頁面(如在谷歌日曆或其他網頁上),該應用程序仍然認爲我已登錄。是否有另一種更好的方法來檢查用戶是否仍然登錄?

另外我知道這可以用web.xml中的安全約束完成,但在這種情況下不起作用,因爲如果用戶已註銷,我需要採取特定操作。

我使用的App Engine SDK 1.7和GWT SDK 2.4

回答

1

兩種方式來通知用戶退出應用程序:

  1. 同步方式 - 服務器主動通知有關注銷客戶端(瀏覽器)。使用Channels API向客戶端發送推送通知。有一個GWT wrapper

  2. 異步 - 當客戶端與服務器進行通信時,即在每個RPC調用添加驗證檢查時,服務器通知客戶端註銷。如果用戶標識登出,引發異常,可以是handled by GWT

+0

目前我正在通過RCP調用(使用AppUser)檢查用戶是否加載了新頁面。如果我沒有登錄,不應該這樣做嗎? – dkellycollins 2012-08-17 20:06:19

1

我遇到了這個今天,雖然這是糟糕的:我已經註銷的用戶A(從谷歌網站頁面),並登錄爲用戶B,但我的GAE應用程序以爲我在記錄以用戶A.阿格。

原因是這裏涉及兩個Cookie,一個用於跟蹤哪個Google用戶登錄Google,另一個用於跟蹤哪個GAE應用程序用戶登錄到我的GAE應用程序。回想一下GAE可以使用任何聯合身份驗證服務,而不僅僅是Google的。我的應用程序無法訪問google.com cookie,因此我無法直接檢查用戶A是否仍然登錄(或當前登錄的用戶)。

不幸的是,我還沒有找到一個簡單的「聯合退出」機制,雖然有可能Google Identity Toolkit可用於檢測在預期的用戶不再登錄。

我發現別人討論這個問題:

更新

我想出了一個適用於我的應用程序的解決方案,在該解決方案中我有一個將用戶(學生)重定向到他或她的教室主頁的頁面。因爲這是任何一個學生不經常訪問的(一天幾次),但需要知道哪些學生已登錄,我採取了以下的做法,爲我工作:

  1. 用戶進入網頁A,它清除ACSID和SACSID cookie,並重定向到Google以供用戶登錄。
  2. 用戶可能已經登錄,因此Google(具有多個重定向)將ACSID和SACSID cookie更新爲當前登錄的用戶,並將其重定向回頁面B的我的應用程序。
  3. Page B最終代表採取行動的登錄用戶,「確信」正確的用戶已登錄(到頁面有信​​心)。 ;-)

下面是該方法的一個代碼草圖:

# My BaseHandler has a clear_cookie 
class LoginAndRedirectHandler(base_handler.BaseHandler): 
    def get(self): 
    self.clear_cookie('ACSID') 
    self.clear_cookie('SACSID') 
    self.clear_cookie('dev_appserver_login') 

    if 'continue' in self.request.params and \ 
     self.request.params['continue'].startswith('/'): 
     url = self.request.params['continue'] 
    else: 
     # Whatever your page is that needs an up to date logged in user 
     url = users.create_login_url('/PageB') 

    if isinstance(url, unicode): 
     url = url.encode('utf8') 
    logging.info('Redirecting to ' + url) 
    self.redirect(url) 
    return 

我之所以說不常上面是,這個過程是在時間上昂貴,具有至少4或5重定向參與。

相關問題