【问题标题】:Reseting session based on user agent and/or ip change. Rails with Devise根据用户代理和/或 ip 更改重置会话。带设计的 Rails
【发布时间】:2016-01-20 16:00:32
【问题描述】:

我想在用户代理和/或用户 IP 更改时重置会话。项目使用带有 Devise 的 Rails 进行身份验证,使用 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 更改时,应删除会话并注销用户。但是,当使用不同的浏览器进行测试时,warden.session['user_agent'] 会根据我使用的浏览器而变化。我想我误解了什么。另外,如果有更好的方法来解决这个问题,请分享。

谢谢!

【问题讨论】:

  • 基本上你在做什么是行不通的,因为它取决于过滤器链的顺序。我会考虑创建一个custom authentication strategy for Warden。但是,在使用移动连接时,我个人在使用基于 IP 的身份验证解决方案时遇到了很多问题——尤其是在 3 个世界国家。检查用户代理是一种神秘的做法,没有什么优点,因为它很容易被欺骗。
  • 感谢您的提示。我试过编写 Warden 策略,但是我遇到了两个问题:1)Warden 似乎只在登录时进行身份验证,这里的目标是在用户登录后验证(授权?)每个请求。2)对于某些人即使 falsevalid? 出来,策略中的原因仍然会执行身份验证方法,因此会破坏登录页面上的所有内容。第一个问题使第二种无关紧要。

标签: ruby-on-rails ruby devise warden


【解决方案1】:

我已经通过将它添加到 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 2018-08-23
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多