我正在运行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
答案 0 :(得分:1)
通知应用程序注销用户的两种方法:
同步 - 服务器主动通知客户端(浏览器)注销。使用Channels API向客户端发送推送通知。有GWT wrapper。
异步 - 当客户端与服务器进行通信时,服务器会通知客户端有关注销的信息,即在每个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可能用于检测预期用户不再登录。
我发现其他人正在讨论这个问题:
<强>更新强>
我提出了一个适用于我的应用程序的解决方案,我有一个页面可以将用户(学生)重定向到他或她的教室主页。由于任何一个学生(一天几次)不经常访问,但需要知道哪个学生已登录,我采取了以下方法,对我有用:
以下是该方法的代码草图:
# 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个重定向。