根据用户代理和/或IP更改重新设置会话。与设计的路轨

时间:2016-01-20 16:00:32

标签: ruby-on-rails ruby devise warden

我想在用户代理和/或用户IP更改时重置会话。 Project使用Rails with Devise进行身份验证,CanCanCan进行授权。

我的方法是:

class ApplicationController < ActionController::Base

  before_action :authorize_ip

  def authorize_ip
    if warden.authenticated?
      warden.session['ip'] ||= request.ip
      warden.session['user_agent'] ||= request.user_agent
      warden.logout if warden.session['ip'] != 'request.ip' &&
        warden.session['user_agent'] != request.user_agent
    end
  end
end

根据我的理解,它应该设置warden.session['ip']和user_agent一次,然后在request['ip']或user_agent更改时跟随请求,会话应该被删除,User应该被注销。但是,在使用不同浏览器进行测试时,warden.session['user_agent']会根据我使用的浏览器进行更改。我想我误解了一些事情。此外,如果有更好的方法解决此问题,请分享。

谢谢!

1 个答案:

答案 0 :(得分:3)

我已将此问题添加到initializers / devise.rb

,从而解决了这个问题
  Warden::Manager.after_authentication do |_user, auth, _opts|
    auth.raw_session['warden.user.ip'] = auth.request.ip
    auth.raw_session['warden.user.user_agent'] = auth.request.user_agent
  end

这是应用程序控制器:

class ApplicationController < ActionController::Base

  before_action :authorize_ip_user_agent

  protected

  def authorize_ip_user_agent
    return true unless session['warden.user.ip']
    warden.logout if session['warden.user.ip'] != request.ip &&
      session['warden.user.user_agent'] != request.user_agent
  end
end