我将scala 2.2
与play-framework 2.2
我不知道是否可能,但我必须从网站强行注销所有用户。我知道这不会对我有所帮助。
Redirect("/").withNewSession
答案 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重新安装到位,我实际上永远不需要使用我的密码重新进入该网站。
如果出于某种原因,您无法将会话管理方法更改为基于令牌,那么您可以向您的网站引入其他内容,以模拟令牌为您提供的可能性。然而这些都是黑客攻击,所以我不打算提出它们!再一次,我会使用令牌。