【问题标题】:Sharing Rails session with other apps using DB Session Storage使用 DB Session Storage 与其他应用程序共享 Rails 会话
【发布时间】:2012-03-02 10:17:35
【问题描述】:

设计 gem 用于身份验证。

Rails 会话存储在数据库中

为了在 Rails 3 之外使用会话,我创建了一个名为 Session 的模型。在sessions 表中添加了user_id 列。

当用户登录时,我应该更新会话表中的user_id 列。所以在ApplicationController我加了一个方法:

  protected
  def after_sign_in_path_for(resource)
    @session = Session.find_by_session_id(request.session_options[:id])
    @session.update_attribute(:user_id, current_user.id)
    stored_location_for(resource) || root_path if @session.save
  end

但在重定向之后,最近的 session 被破坏,我在 DB 中结束了另一个会话,空白 user_id

成功登录后写user_id 的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails devise session-storage


    【解决方案1】:

    José Valim(Devise 的)回答:

    从 Rails 3.1 开始,Warden 在用户登录时设置 :renew 选项,强制销毁旧会话并创建新会话。

    所以我最终做的是在ApplicationController 中创建update_session 过滤器。

      before_filter :update_session
    
      protected
      def update_session
        if user_signed_in?
          @session = Session.find_by_session_id(request.session_options[:id])
          @session.update_attribute(:user_id, current_user.id)
        end
      end
    

    由于 Rails 缓存 DB 查询,因此不会有实际的 SQL 调用来从 sessions 表中获取会话。它已经在记忆中了。更新也是如此。 Rails 只会在第一次更新user_id。所有其他时间UPDATE 查询都不会转到 DBMS。

    【讨论】:

    • 顺便说一句,@session 不需要使用实例变量。
    猜你喜欢
    • 2017-03-19
    • 2012-02-26
    • 1970-01-01
    • 2011-02-28
    • 2022-09-28
    • 2011-03-13
    • 2013-02-15
    • 2012-04-05
    • 2018-08-29
    相关资源
    最近更新 更多