每个模型的Rails应用具有不同的会话存储

时间:2018-12-14 13:02:13

标签: ruby-on-rails session devise

我在Rails应用中有两个模型(Devise)进行登录(Devise)-Admin和User,当前都使用默认的cookie存储来存储会话数据。

我希望能够在来自管理员的AJAX请求中标识一个Admin会话,以授权这些API调用。我计划通过在管理员登录时设置加密的cookie来实现此目的。调用AJAX API时,我打开cookie,从中获取一些标识,然后在商店中查找匹配的现有Admin会话。

据我了解,要做到这一点,我必须通过数据库或内存缓存存储将会话信息存储在后端。

我希望在任何给定时间都有数百万个User会话和Admin几个会话。因此,我不想将所有会话信息都移到数据库或内存中,因为这是一堆不需要的数据来存储。我只想存储/查看管理会话数据。

一个解决方案是创建一些自定义模型,该模型枚举Admin用户会话,并由应用维护。这很简单,但是例如需要一种在会话退出时清理会话而无需注销的方法。本质上,这是尝试复制Rails的会话存储机制,该机制带有存储和维护会话的所有问题。本能告诉我避免这种解决方案。我是否正确避免这种情况?

如果是这样,那么我的问题是,是否有办法在Rails应用中配置多个会话存储,对于每个登录的Model都配置一个不同的存储?在这种情况下,请将Admin会话存储在内存中,将User会话存储在cookie中。如果没有,我将不胜感激任何意见和建议。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可能会认为这是错误的。

会话是一种底层机制,您可以在此基础上构建身份验证。它只是一个包含标识符(随机哈希)的cookie,该标识符链接到会话存储(默认为cookie)。这是一种将持久性添加到无状态协议的简单机制。

令人困惑的是,在谈论身份验证时,我们也使用“会话”的概念-例如,登录用户通常被称为“创建会话”。这是完整的poppycock,因为我们只是在用户首次访问应用程序时创建的会话中存储声明(通常是用户ID)。

  

如果是这样,那么我的问题是,有没有办法配置多个   会话存储在Rails应用中,每个登录的存储都不同   型号?

否。那是鸡与蛋的难题。为了知道要使用哪个会话存储,您需要访问会话存储以知道要使用哪个会话存储...您会明白。

虽然您可以创建自己的会话存储机制以不同的方式工作,但这很可能会浪费时间。 过早的优化是万恶之源

  

据我了解,要执行此操作,我必须存储会话信息   在后端,通过数据库或内存缓存存储。

不太正确。您可以仅使用Cookie存储就可以很好地构建身份验证解决方案。在那种情况下,Rails只会在服务器上保留一个会话标识符有效的记录。

您需要在数据库或memcached中存储其他会话信息的主要原因是,如果您需要在会话中存储比cookie允许的4093字节更多的数据。毕竟,Cookie存储要快得多,并且可以在99%的时间内完成工作。 YAGNI

您还应该认识到,并非所有内容都需要保存在会话存储中。例如,Devise trackable module将登录/注销时间戳记保存在用户表上,作为认证用户过程的一部分。这是“会话信息”,但与会话存储无关。

  

我希望能够在即将到来的AJAX请求中识别一个管理会话   从管理员那里获得这些API调用的授权。

有很多方法可以对应用程序的不同部分(例如Warden strategies)使用不同的身份验证逻辑。对于API,您可能需要考虑使用无状态(和无会话)身份验证,例如JWT。

相关问题