【问题标题】:Rails and Authlogic: Allow only one session per user?Rails 和 Authlogic:每个用户只允许一个会话?
【发布时间】:2011-11-25 08:55:45
【问题描述】:

有没有办法限制 Ruby on Rails 应用程序中的会话数(我使用 Authlogic 进行身份验证)?

我希望每个用户帐户只允许 1 个会话。当同一用户登录另一台计算机时,前一个会话应该过期/失效。

我正在考虑将会话数据存储在数据库中,然后在创建新会话实例时将其删除,但可能有更简单的方法? (配置选项)

【问题讨论】:

    标签: ruby-on-rails session authentication authlogic


    【解决方案1】:

    我刚刚遇到了一个可能的解决方案,如果你重置 presistence 令牌,你可以实现预期的行为:

    class UserSession < Authlogic::Session::Base
      before_create :reset_persistence_token
    
      def reset_persistence_token
        record.reset_persistence_token
      end
    end
    

    这样做会使用户登录的旧会话失效。

    之前我按照你提到的那样实现了它:向用户表添加一个 session_key 字段,并确保在登录时为用户存储当前 session_id:

    class UserSession < Authlogic::Session::Base
      after_save :set_session_key
      def set_session_key
        record.session_key = controller.session.session_id
      end
    end
    

    然后在通用控制器中执行以下操作以在其他人使用相同帐户登录时踢出用户:

    before_filter :check_for_simultaneous_login
    
    def check_for_simultaneous_login
      # Prevent simultaneous logins
      if @current_user && @current_user.session_key != session[:session_id]
        flash[:notice] = t('simultaneous_logins_detected')
        current_user_session.destroy
        redirect_to login_url
      end
    end
    

    【讨论】:

      【解决方案2】:

      我完全按照您所说的进行,为每个 uniq 会话分配一个会话 ID,将该 ID 存储在 cookie 中,并将相关的会话数据存储在一个表中。效果很好。我的目的不是将用户限制在单个会话中,而是将会话变量保留在服务器端以防止用户操纵。

      【讨论】:

        猜你喜欢
        • 2012-06-02
        • 1970-01-01
        • 2014-10-11
        • 2015-03-12
        • 2015-11-03
        • 2013-11-10
        • 1970-01-01
        • 2019-10-19
        • 2019-08-22
        相关资源
        最近更新 更多