如何确定用户是否已登出其他页面

时间:2012-08-17 16:19:45

标签: google-app-engine

我正在运行Google App Engine项目,每次用户执行操作时我都要检查以查看用户是否已登录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中的security-constraint来完成,但是在这种情况下这不起作用,因为如果用户已经注销,我需要采取某些操作。

我正在使用App Engine SDK 1.7和GWT SDK 2.4

2 个答案:

答案 0 :(得分:1)

通知应用程序注销用户的两种方法:

  1. 同步 - 服务器主动通知客户端(浏览器)注销。使用Channels API向客户端发送推送通知。有GWT wrapper

  2. 异步 ​​- 当客户端与服务器进行通信时,服务器会通知客户端有关注销的信息,即在每个RPC调用中添加身份验证检查。如果用户标识已注销,则引发异常,可以是handled by GWT

答案 1 :(得分:1)

今天我遇到了这个问题,虽然情况更糟:我已经以用户A(来自Google协作平台页面)退出,并以用户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. 页面B最终代表登录用户采取行动,“确信”正确的用户已登录(在页面有信心的范围内)。 ; - )
  4. 以下是该方法的代码草图:

    # 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个重定向。