我尝试使用设计身份验证为单个用户禁用多重登录,并提出了此解决方案。
我使用了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_filter
(aplication_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。
此设置正常运行没有任何问题。伙计们,请您分享您对此实施的建议。这个解决方案会出现任何潜在的问题吗?
答案 0 :(得分:0)
有一个类似的问题,
Devise - Invalidate user session if the same user logs in from a different browser/machine
基本思想是相同的,不同的实现。
个人喜欢它,因为它完全在控制器中,而不是在模型中。