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

Posted

技术标签:

【中文标题】播放框架会话和 cookie 是如何工作的?【英文标题】:Play framework how do sessions and cookies work? 【发布时间】:2013-01-15 16:09:58 【问题描述】:

play 如何验证 cookie?

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

cookie 如下所示:

PLAY_SESSION=e6443c88da7xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-userid%3A1

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


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

Ok("Bye").withNewSession

【问题讨论】:

【参考方案1】:

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

它使用用户的 id 来识别用户,并检查签名会话 cookie 是否未被操纵,因此如果您使用正确的签名重新创建 cookie,它仍然有效。

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

AFAIR 标准内存缓存将在应用程序每次重新启动时被清除,以确保从 DB 中删除所有 sess_keys,您可以使用 Global object 并在 onStart(...) 方法中截断表。

【讨论】:

此时简单地远离 Play 的会话生态系统是否公平(就身份验证而言)?我正在考虑使用 redis 作为半持久缓存来管理 sesh id,并单独使用 Play 的会话来存储公共会话数据。这个计划听起来不错?【参考方案2】:

我发现答案阅读the documentation更仔细并结合不同的部分。

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


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


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

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

【讨论】:

"如果 cookie 丢失,以后任何人都可以登录服务器",这意味着什么?如果没有 cookie,就没有访问权限,都是客户端,Play 只是确保(签名的)cookie 本身没有被篡改。 不要认为迷失是虚无,而是误入歧途。 以后,请链接到相关文档,以便阅读您答案的读者进一步调查。

以上是关于播放框架会话和 cookie 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有令牌而不是 Cookie 的 Django 会话框架?

播放框架中的会话处理

Zend 框架、会话和 HttpOnly

Django框架(十五)-- cookie和session组件

如何向用户显示会话过期消息(CodeIgniter 框架)?

Django 框架篇: Cookie 与 Session