根据用户代理 and/or ip 更改重置会话。 Rails 与设计
Reseting session based on user agent and/or ip change. Rails with Devise
我想在用户代理 and/or 用户 ip 更改时重置会话。项目使用 Rails 和 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 发生变化时跟随请求,会话应该被删除,用户应该被注销。但是,当使用不同的浏览器进行测试时,warden.session['user_agent']
会根据我使用的浏览器而变化。我想我误会了什么。另外,如果有更好的方法解决这个问题,请分享。
谢谢!
我已经通过将此添加到 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
我想在用户代理 and/or 用户 ip 更改时重置会话。项目使用 Rails 和 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 发生变化时跟随请求,会话应该被删除,用户应该被注销。但是,当使用不同的浏览器进行测试时,warden.session['user_agent']
会根据我使用的浏览器而变化。我想我误会了什么。另外,如果有更好的方法解决这个问题,请分享。
谢谢!
我已经通过将此添加到 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