使用 Play 缓存 API 存储用户会话 ID?

Posted

技术标签:

【中文标题】使用 Play 缓存 API 存储用户会话 ID?【英文标题】:Using the Play cache API for storing user session ids? 【发布时间】:2015-02-07 14:47:02 【问题描述】:

我想做的是在我的 Play 应用程序中实现一个简单的身份验证机制。与 Play 的 ZenTask Tutorial 不同,我认为将经过身份验证的用户的会话 ID 单独 存储在会话中并不是一个好主意(在 Play 中,它是一个签名的 cookie ),因为这样服务器就无法控制已登录用户的登录状态。图像用户帐户被删除或者您想要强制注销特定用户 - 如果该用户具有有效的 cookie,他仍然会在下一个请求中成功通过身份验证,因为服务器只会检查 cookie 中是否存在会话 ID。

所以我想知道:如何使用 Play 缓存 API 来存储用户的会话 ID?在每个页面请求中,可以在缓存中查找请求中包含的会话 ID。如果不存在,则用户必须登录。

从我的角度来看的好处:

上述问题已解决。已删除的用户或强制注销的用户不再登录,因为可以在服务器端更改缓存内容 目前,我的播放应用程序不需要超过一台机器,因此 Play 可以在内部使用 EHCache。如果将来我需要扩展并不得不部署额外的机器,EHCache 可以被外部和分布式的 memached 服务器替换,而无需更改代码。

你怎么看?

【问题讨论】:

【参考方案1】:

我认为这是一种完全有效的方法,举个例子,play2-auth 库通过其CacheIdContainer 提供了一种方法。

正如作者points out 所述,与使用会话cookie 的方法相比,这种有状态方法的主要优势在于,当用户在其他地方登录时,它会使用户之前的会话无效。

主要缺点是,至少如果您使用 Play 的默认 EHCache,会话不会在服务器重新启动后持续存在,但您可以使用 memcache 之类的东西来解决这个问题。

【讨论】:

谢谢,试一试。最后一件事:您提到的优势不也是可用性方面的劣势吗?如果我没记错的话,这意味着用户不可能同时从多个设备(例如计算机和智能手机)登录。您知道这方面的最佳做法吗? 我同意。这取决于您的用例。我想一个很好的平衡是登录表单上的“记住我”复选框。我个人认为,如果您不处理任何重要的事情,那么 cookie 会话是可以的,但您的里程可能会有所不同。

以上是关于使用 Play 缓存 API 存储用户会话 ID?的主要内容,如果未能解决你的问题,请参考以下文章

在 Keycloak 集群的 Infinispan 缓存中存储用户会话的确切用途是啥?

从 Google Play Games API 获取用户 ID?

symfony 3.3中的单个会话实现

PHP存储会话数据,在会话中存储用户ID

Webview 会话存储缓存/存储的位置和方式

DAL、会话、缓存架构