Ruby on rails 3 ActionController会话和子类
默认情况下,所有rails控制器都继承应用程序控制器 在我的应用程序中,我希望用户能够使用http basic auth从任何页面进行身份验证,也可以通过发布进行身份验证,但只能向一个控制器进行身份验证 目前情况如下(简化):Ruby on rails 3 ActionController会话和子类,ruby-on-rails-3,before-filter,Ruby On Rails 3,Before Filter,默认情况下,所有rails控制器都继承应用程序控制器 在我的应用程序中,我希望用户能够使用http basic auth从任何页面进行身份验证,也可以通过发布进行身份验证,但只能向一个控制器进行身份验证 目前情况如下(简化): class ApplicationController
class ApplicationController
我在set\u user\u from_params
和set\u current\u user
中设置了一个断点,并验证了它们确实是按照正确的顺序调用的
set\u user\u from_params
实际上是正确设置了session[:user]
,但是当我继续并点击set\u current\u user
内的断点时,会话哈希是空的
这是预期的行为还是我错过了一些非常明显的东西?如果请求是post请求,那么默认情况下rails将检查是否存在有效的csrf令牌 在插入执行该检查的过滤器之前插入一个
,如果失败,rails将重置会话,这与您的情况一致
您需要确保post请求包含真实性令牌,或者(如果合适)通过跳过verify\u authenticity\u token
过滤器禁用该检查
验证这一点的一种方法是添加
def处理未经验证的请求
超级的
Rails.logger.info“处理未经验证的请求-csrf问题”
结束
到你的控制器。如果问题是csrf问题,则将调用此方法并写入日志文件,确认已发生此问题。回答得很好,谢谢!在我的例子中,身份验证来自一个还没有会话或令牌的应用程序。对于其他有此功能的人,我只需将skip\u-before\u-filter:verify\u-authenticity\u-token,:only=>:create
添加到相关控制器中。
class ApplicationController < ActionController::Base
before_filter :set_current_user
private
def set_current_user
Authorization.current_user = current_user
end
def current_user
if session[:user].blank?
authenticate_or_request_with_http_basic do |user,pass|
session[:user] = authenticated_user_or_nil
end
end
session[:user]
end
end
class UserSessionsController < ApplicationController
prepend_before_filter :set_user_from_params
private
def set_user_from_params
session[:user] = authenticated_user_or_nil
end
end