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 不工作的主要内容,如果未能解决你的问题,请参考以下文章

rails是啥意思

Rails:在 Rails 6 中使用绝对路径

Rails:rails 模型的默认排序顺序?

markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails

Rails:如何在 Rails 中为 Devise 设置密钥?

从 Rails 2 到 Rails 3 路由