Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 ActionController会话和子类_Ruby On Rails 3_Before Filter - Fatal编程技术网

Ruby on rails 3 ActionController会话和子类

Ruby on rails 3 ActionController会话和子类,ruby-on-rails-3,before-filter,Ruby On Rails 3,Before Filter,默认情况下,所有rails控制器都继承应用程序控制器 在我的应用程序中,我希望用户能够使用http basic auth从任何页面进行身份验证,也可以通过发布进行身份验证,但只能向一个控制器进行身份验证 目前情况如下(简化): class ApplicationController

默认情况下,所有rails控制器都继承应用程序控制器

在我的应用程序中,我希望用户能够使用http basic auth从任何页面进行身份验证,也可以通过发布进行身份验证,但只能向一个控制器进行身份验证

目前情况如下(简化):

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