Rails 设计,通过 session_store 键找到 current_user

Posted

技术标签:

【中文标题】Rails 设计,通过 session_store 键找到 current_user【英文标题】:Rails devise, find current_user by session_store key 【发布时间】:2018-07-07 13:48:18 【问题描述】:

我们有一个在 Rails 上运行的生产系统(主应用程序),配置了 devise gem(使用 Redis 会话存储)(为所有子域启用会话)

我需要为我们基于子域的微服务之一构建自定义身份验证服务。对于每个请求,此微服务将使用会话 id(rails 会话存储键的 cookie 值)(在 config/initializers/session_store.rb 中配置)调用我们的主应用程序。

所以问题是,我可以仅通过会话 ID 找到用户吗? (使用设计或守望者)

【问题讨论】:

【参考方案1】:

您可以使用 Devise 的 Authenticatable 模块添加到名为 serialize_from_session 的资源中的方法来执行此操作。您可以传入扩展的 Warden 会话变量,其中包括密钥和盐(serialize_from_session 接受这两者作为参数)。例如,如果您在 User 模型上使用 Devise:

user = User.serialize_from_array(*session['warden.user.user.key'])

session['warden.user.user.key'] 变量是记录 ID(作为数组)和盐的数组。它看起来像[[1], "$2f$23$2DIUF7Vr.J5sbfGwHTew"]

【讨论】:

感谢您的回答。为此,我需要一个会话对象。但我没有会话对象(Assum inside rails 控制台)。我只有会话 ID。那么如何从 Redis 中找到这个warden 信息呢? 您能说明一下您是如何处理会话的吗? “使用 rails session store key 的 cookie 值调用我们的主应用程序”。我的想法是您可以通过在 Redis 会话存储中查询 cookie 中的键来获取会话数据 很抱歉给您带来了困惑。我更新了问题。现在我通过将您的答案与***.com/a/35319202/1866804 合并得到了解决方案,感谢@xavier 的帮助

以上是关于Rails 设计,通过 session_store 键找到 current_user的主要内容,如果未能解决你的问题,请参考以下文章

rails session_store 由cookie_store改为active_record_store,sidekiq页面进入后session消失

在 Rails 3 中设置会话超时

可以删除所有用户的所有 Rails 会话信息

Cookie 与 CookieStore 的会话

首选 Rails 3 RESTful 设计?

从 Rails 控制台设计密码重置