有没有办法限制Ruby on Rails应用程序中的会话数量(我使用Authlogic进行身份验证)?
我想每个用户帐户只允许1个会话。当同一用户登录另一台计算机时,上一个会话应该过期/无效。
我正在考虑将会话数据存储在数据库中,然后在创建新会话实例时删除它,但可能有更简单的方法吗? (配置选项)
答案 0 :(得分:2)
我刚刚遇到了一个可能的解决方案,如果您重置presistence令牌,您可以实现预期的行为:
class UserSession < Authlogic::Session::Base
before_create :reset_persistence_token
def reset_persistence_token
record.reset_persistence_token
end
end
通过这样做,登录用户的旧会话无效。
之前我按照你的提到实现了它:将一个session_key字段添加到users表中,并确保在登录时为用户存储当前的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
答案 1 :(得分:0)
我完全按照您的说法进行操作,为每个uniq会话分配会话ID,将该ID存储在cookie中,并将相关的会话数据存储在表中。效果很好。我的目标不是将用户限制为单个会话,而是保持会话变量服务器端以防止用户操作。