rails skip_before_filter :verify_authenticity_token 不工作
Posted
技术标签:
【中文标题】rails skip_before_filter :verify_authenticity_token 不工作【英文标题】:rails skip_before_filter :verify_authenticity_token not working 【发布时间】:2011-12-03 01:35:05 【问题描述】:我需要通过 ruby 脚本从办公室计算机发布到远程服务器。我放了
skip_before_filter :verify_authenticity_token
在控制器中,但每次尝试我都会得到“你想要的更改被拒绝”,当我查看日志时,我得到了
ActionController::InvalidAuthenticityToken
我是不是误会了什么? 这是来自 ruby 脚本的代码
url="display_ad[title]=#row[1]"
date_arr = row[2].split('/')
start_date = date_arr[2].to_s + "-" + date_arr[0].to_s + "-" + date_arr[1].to_s
url+="&display_ad[start_date]=#start_date"
date_arr = row[3].split('/')
end_date = Date.new( date_arr[2].to_i, date_arr[0].to_i, date_arr[1].to_i )
end_date = end_date + 7
end_date = end_date.strftime("%Y-%m-%d")
url+="&display_ad[end_date]=#end_date"
url+="&display_ad[slug]=#row[7]"
url+="&display_ad[category]=othr"
url = url.gsub("\n","")
url = url.gsub("\r","")
p url
easy = Curl::Easy.http_post("http://example.com/advertising/web/web_service_add", url)
在控制器动作中
ad = DisplayAds.new(params[:display_ad])
ad.save
【问题讨论】:
您能否详细介绍一下您的代码? 跳过过滤器没有帮助真的很奇怪,但你可以试试protect_from_forgery :only => []
很遗憾,由于时间限制,我不得不将其更改为 GET。
protect_from_forgery :only => [] 也不起作用
【参考方案1】:
在 Rails 2.3.8 项目遇到同样问题后,我进入了这个页面。我在多个控制器中成功使用了skip_before_filter :verify_authenticity_token
,但这是我第一次尝试在应用程序控制器中定义的操作的ApplicationController
类的顶部使用它。
我将我的操作与 skip_before_filter 行一起移动到另一个控制器,并且验证被正确禁用,正如预期的那样。我认为问题可能在于,当直接在应用程序控制器中用于该类中定义的操作时,它不会像您预期的那样工作。我还没有调查为什么会这样,因为我的懒惰编码是在那里定义了我正在努力解决的具体操作,所以无论如何移动它是一个更好的选择。遇到此问题的其他人应尝试将其受影响的操作移出ApplicationController
类。
有趣的是,在 Rails 3.2.1 项目中,我在 ApplicationController
中使用了 skip_before_filter :verify_authenticity_token
,并在类中定义了一个动作,并且效果很好。
【讨论】:
【参考方案2】:请检查您的代码是否有这一行:
protect_from_forgery
它将启动 csrf 保护。 请记住,将所有 sckip_before_filter 都放在此方法之后。
祝你好运!
【讨论】:
不适用于仅 API 模式。 See this Philnash 的 asnwer,它解决了我的问题。以上是关于rails skip_before_filter :verify_authenticity_token 不工作的主要内容,如果未能解决你的问题,请参考以下文章
markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails