【发布时间】:2011-11-25 08:55:45
【问题描述】:
有没有办法限制 Ruby on Rails 应用程序中的会话数(我使用 Authlogic 进行身份验证)?
我希望每个用户帐户只允许 1 个会话。当同一用户登录另一台计算机时,前一个会话应该过期/失效。
我正在考虑将会话数据存储在数据库中,然后在创建新会话实例时将其删除,但可能有更简单的方法? (配置选项)
【问题讨论】:
标签: ruby-on-rails session authentication authlogic
有没有办法限制 Ruby on Rails 应用程序中的会话数(我使用 Authlogic 进行身份验证)?
我希望每个用户帐户只允许 1 个会话。当同一用户登录另一台计算机时,前一个会话应该过期/失效。
我正在考虑将会话数据存储在数据库中,然后在创建新会话实例时将其删除,但可能有更简单的方法? (配置选项)
【问题讨论】:
标签: ruby-on-rails session authentication authlogic
我刚刚遇到了一个可能的解决方案,如果你重置 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
【讨论】:
我完全按照您所说的进行,为每个 uniq 会话分配一个会话 ID,将该 ID 存储在 cookie 中,并将相关的会话数据存储在一个表中。效果很好。我的目的不是将用户限制在单个会话中,而是将会话变量保留在服务器端以防止用户操纵。
【讨论】: