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 中的 security-constraint 来完成,但是在这种情况下这将不起作用,因为如果用户已注销,我需要采取某些措施。

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

4

2 回答 2

1

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

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

  2. 异步 - 当客户端与服务器通信时,服务器会通知客户端注销,即在每个 RPC 调用中添加身份验证检查。如果用户 id 注销,则引发异常,可由 GWT 处理

于 2012-08-17T19:49:53.410 回答
1

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

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

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

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

更新

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

  1. 用户转到页面 A,该页面清除了 ACSID 和 SACSID cookie,并重定向到 Google 以供用户登录。
  2. 用户可能已经登录,因此谷歌(有几个重定向)将 ACSID 和 SACSID cookie 更新为当前登录的用户,并在页面 B 处重定向回我的应用程序。
  3. 页面 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 个重定向。

于 2012-09-03T15:42:38.870 回答