使用rails禁用单用户多登录轨道

时间:2014-05-23 06:20:11

标签: ruby-on-rails ruby-on-rails-4 session-cookies

我尝试使用设计身份验证为单个用户禁用多重登录,并提出了此解决方案。

我使用了active record session store,因此我可以按ID访问所有用户会话。已将初始化程序session_store.rb更改为

MyApp::Application.config.session_store :active_record_store 

将字段session_id添加到用户表并为会话创建模型(session.rb)

rails migration:

rails g migration add_session_id_to_users session_id:integer

session.rb

class Session < ActiveRecord::Base
end

因为,使用warden设计gem我设置回调after_authentication来检查用户会话。

user.rb

class << self
  def delete_session(session_id)
    begin
      session = Session.where("session_id=?",session_id)
      session.delete_all
    rescue => e

    end
  end
end

Warden::Manager.after_authentication do |user, auth, opts|
  unless user.session_id == ""
    auth.logout
    User.delete_session(user.session_id)
    user.session_id = ""
    user.save
    throw(:warden, :message => "User already logged in, try again wil singout from other machine")

  end
end

当用户已登录时,此回调将发出警告。

我将用户会话ID存储在application_controller before_filteraplication_helper.rb

before_action :save_session

def save_session
  if user_signed_in? && current_user.session_id == ""
    current_user.session_id =  request.session_options[:id]
    current_user.save
  end
end

我按request.session_options[:id]获取了会话ID。

此设置正常运行没有任何问题。伙计们,请您分享您对此实施的建议。这个解决方案会出现任何潜在的问题吗?

1 个答案:

答案 0 :(得分:0)

有一个类似的问题,

Devise - Invalidate user session if the same user logs in from a different browser/machine

基本思想是相同的,不同的实现。

个人喜欢它,因为它完全在控制器中,而不是在模型中。