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

Far*_*mor 15 java authentication cookies scala playframework-2.0

游戏如何验证cookie?

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

cookie看起来像这样:

PLAY_SESSION = e6443c88da7xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-的userid%3A1

// My logout code
def logout() = Action {
  Ok("").withNewSession
}
Run Code Online (Sandbox Code Playgroud)

从文档中
删除整个会话
有一个特殊操作丢弃整个会话:

Ok("Bye").withNewSession
Run Code Online (Sandbox Code Playgroud)

bie*_*ior 10

您没有指定如何对用户进行身份验证,所以我只是猜测,您正在使用简单的简单示例.

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

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

每次重新启动应用程序时都会清除AFAIR标准内存缓存,以确保sess_keys删除所有来自DB的内容,您可以使用Global对象并截断onStart(...)方法中的表.


Far*_*mor 5

我找到了更仔细阅读文档并结合不同部分的答案.

会话没有技术超时.它在用户关闭Web浏览器时到期.如果您需要特定应用程序的功能超时,只需将时间戳存储到用户会话中,然后根据您的应用程序需要使用它(例如,最长会话持续时间,最长不活动持续时间等).


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


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

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