播放框架会话和cookie如何工作?

时间:2013-01-31 14:13:21

标签: java scala authentication cookies playframework-2.0

游戏如何验证cookie?

  • 我注意到在我重新启动服务器后,即使我,我仍然登录 不要在数据库中预先存储任何会话数据。
  • 我也注意到了 我可以将服务器上的日期设置为大于exipry的日期 cookie的日期,但我仍然登录。
  • 我退出了 (将cookie保存到文本文件中)并且浏览器丢失了cookie。然后我 从文本文件中重新创建了cookie,我又重新登录了。

Cookie看起来像这样:

PLAY_SESSION = e6443c88da7xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-的userid%3A1

// My logout code
def logout() = Action {
  Ok("").withNewSession
}

From the documentation
放弃整个会话
有一个特殊的操作会丢弃整个会话:

Ok("Bye").withNewSession

2 个答案:

答案 0 :(得分:10)

您没有指定如何对用户进行身份验证,所以我只是猜测,您正在使用简单的样本,这很简单。

它使用用户的ID来识别用户,并检查是否未操作已签名的会话cookie,因此如果您使用适当的签名重新创建cookie,它仍然有效。

您应该在服务器端为会话密钥创建一些区域,即。在DB或内存缓存中(这将比DB快)。对于每个成功的登录操作,其密钥应该是随机生成的(并且优选地相当长),并且还应该包含用于标识用户,到期日期等的数据。接下来,您应该将此随机sess_key放入Play的会话而不是电子邮件地址在DB中记录用户或其行的ID,并且在注销和/或到期日期之后,应将其删除。在这种情况下,即使您在注销后丢失cookie,也无法使用非esixting sess_key正确登录。

每次重新启动应用程序时都会清除AFAIR标准内存缓存,以确保删除数据库中的所有sess_keys,并且可以使用Global object并截断{{1}中的表}} 方法。

答案 1 :(得分:5)

我更仔细地找到答案the documentation,并将不同部分组合在一起。

  

会话没有技术超时。它会在到期时到期   用户关闭Web浏览器。如果你需要一个功能超时   特定的应用程序,只是将时间戳存储到用户Session和   但是应用程序需要使用它(例如最大会话   持续时间,最长不活动时间等。)。


  

了解Session和Flash数据不是很重要   由服务器存储但被添加到每个后续HTTP请求中,   使用cookie机制。这意味着数据大小非常大   限制(最多4 KB),并且您只能存储字符串值。


所以我担心如果cookie丢失,任何人都可以登录服务器以备将来使用。

我需要做的就是添加一个自制的时间戳授权(在cookie中保存时间戳并验证服务器端)