Google app engine 如何确定用户是否已在其他页面上注销

Google app engine 如何确定用户是否已在其他页面上注销,google-app-engine,Google App Engine,我正在运行一个谷歌应用程序引擎项目,每次用户采取行动时,我都想检查用户是否1)登录2)管理员。这是我为appuser提供的代码: class AppUser { private UserService userService; private User user; public AppUser() { userService = UserServiceFactory.getUserService(); user = userSe

我正在运行一个谷歌应用程序引擎项目,每次用户采取行动时,我都想检查用户是否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两种方式通知应用程序用户注销:

  • 同步-服务器主动通知客户端(浏览器)注销。用于向客户端发送推送通知。有一个问题

  • 异步-当客户端与服务器进行通信时,服务器通知客户端注销,即在每个RPC调用中添加身份验证检查。如果用户id注销,则引发异常,该异常可以是


  • 我今天遇到了这种情况,尽管情况更糟:我以用户A(从Google站点页面)的身份注销,并以用户B的身份登录,但我的GAE应用程序仍然认为我是以用户A的身份登录的。Argh

    原因是涉及到两个cookie,一个用于跟踪哪个Google用户登录到Google,另一个用于跟踪哪个GAE应用程序用户登录到我的GAE应用程序。回想一下,GAE可以使用任何联合身份验证服务,而不仅仅是谷歌的。我的应用程序无法访问google.com cookies,因此我无法直接检查用户A是否仍在登录(或当前登录的用户)

    不幸的是,我还没有找到一个直接的“联合注销”机制,尽管它可能用于检测预期用户不再登录

    我发现其他人正在讨论这个问题:

    更新

    我提出了一个适用于我的应用程序的解决方案,我有一个页面,可以将用户(学生)重定向到他或她的教室主页。由于任何一个学生都很少访问(一天几次),但需要知道哪个学生登录了,因此我采用了以下适合我的方法:

  • 用户转到A页,该页清除ACSID和SACSID cookies,并重定向到Google供用户登录
  • 用户可能已经登录,所以Google(通过几个重定向)将ACSID和SACSID cookie更新为当前登录的用户,并重定向回我的应用程序的第B页
  • 页面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个重定向。

    目前我正在通过RCP调用(使用AppUser)检查用户是否加载了新页面。如果我没有登录,这不应该是假的吗?