【问题标题】:How to access session from Warden/Devise after_authentication callback in Rails如何从 Rails 中的 Warden/Devise after_authentication 回调访问会话
【发布时间】:2011-10-06 20:06:31
【问题描述】:

我正在尝试从 Rails 3 中 Warden 的 after_authenticate 回调(在 Devise 下运行)访问当前会话。

在我的应用程序控制器的顶部,我想做一些类似的事情:

Warden::Manager.after_authentication do |user,auth,opts|
  user.associate_with_ids(session[:pending_ids])
end

最终目标是获取注册前存储在会话中的记录 ID 列表,并在登录后将它们与用户模型相关联。

任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails session authentication devise warden


    【解决方案1】:

    "auth.session" 获取/设置会话密钥 "warden.user.#{scope}.session 中的数据em>”。

    假设您在 rails 应用程序中保存了 pending_ids:

    session[:pending_ids] = ...
    

    如果你想访问warden hook,你可以这样访问它:

    Warden::Manager.after_authentication do |user,auth,opts|
      user.associate_with_ids(auth.env['rack.session'][:pending_ids])
    end
    

    我花了一段时间才发现这一点,所以我想这可能对某人有所帮助。

    (最初取自 diegoscataglini.com/2012/02/09/383/manipulating-sessions-in-wardendevise,现已失效)。

    【讨论】:

      【解决方案2】:

      您可以通过auth访问会话存储:

      Warden::Manager.after_authentication do |user,auth,opts|
        user.associate_with_ids(auth.session[:pending_ids])
      end
      

      【讨论】:

      • 我发现 auth.session 不起作用。它存在,但与控制器上下文中的会话不同。
      • 当我这样做时,我得到了 #<0x007fa2cbfe6c60>
      【解决方案3】:

      您也可以通过auth.request.session访问会话。

      所以你的例子是:

      Warden::Manager.after_authentication do |user,auth,opts|
        user.associate_with_ids(auth.request.session[:pending_ids])
      end
      

      【讨论】:

        【解决方案4】:

        你也可以从auth.raw_session找到整个会话

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-30
          • 2011-04-16
          • 2011-02-17
          相关资源
          最近更新 更多