如何使管理面板中的所有用户的会话失效

时间:2014-01-24 09:21:13

标签: java scala session playframework session-cookies

我将scala 2.2play-framework 2.2

一起使用

我不知道是否可能,但我必须从网站强行注销所有用户。我知道这不会对我有所帮助。

Redirect("/").withNewSession

1 个答案:

答案 0 :(得分:1)

确实可以一次性注销所有用户。这样做的方法是获取您用来跟踪用户的信息并在服务器上使其无效。使用传统的会话管理方法,涉及tokens的发布,这非常简单。然而,基于this comment,这听起来并不像你在服务器端发出令牌,在这种情况下你需要考虑一些不同的东西。

使用令牌进行会话管理

会话管理的传统方法是在成功验证时从服务器发出令牌。假设您将用户存储在数据库表中。在他们登录之前,他们将没有令牌:

user   | token          | ...
-----------------------------
govind |                | ...

用户成功登录后,服务器会生成一个令牌(也称为会话ID)并将其放入该用户的记录中:

user   | token          | ...
-----------------------------
govind | jCwEna9FUCex   | ...

服务器还会将此令牌放入用户的cookie中,现在看起来像:

Cookie: sessionId=jCwEna9FUCex;

此令牌随后用于跟踪用户。每当有人向网站发送请求时,服务器上的一层代码就会执行以下检查:

if a cookie is present in the request, and it had a session ID that we recognise
  allow request
else
  block request

当用户注销时,在登录时执行的操作将被撤消。令牌列在数据库中的记录中清除:

user   | token          | ...
-----------------------------
govind |                | ...

然后从其Cookie中删除令牌:

Cookie:

现在让我们回到退出所有用户。这可以通过清除数据库表中所有用户的token列来实现。这可以通过站点管理员部分的屏幕上的HTTP POST请求来执行。清除列将导致上面的伪代码块中提到的if条件对所有用户都失败。

没有令牌的会话管理

关于令牌的好处是它们可以被清除而没有任何其他副作用。您在cookie中存储的问题是,使这些值(用户ID和用户名)无效会产生非常严重的副作用。我给你的建议是切换到基于令牌的方法。最重要的是,您的方法不是很安全,因为您的cookie可以是replayed

  

如果我是您网站的用户,我可以在首次登录后复制我的Cookie。即使我退出您的网站,只要我将我的cookie重新安装到位,我实际上永远不需要使用我的密码重新进入该网站。

如果出于某种原因,您无法将会话管理方法更改为基于令牌,那么您可以向您的网站引入其他内容,以模拟令牌为您提供的可能性。然而这些都是黑客攻击,所以我不打算提出它们!再一次,我会使用令牌。