Rails 6 - 常量 ActionController::InvalidAuthenticityToken

10
我正在尝试使用Rails 6,但是我经常在由Rails生成的表单上遇到ActionController :: InvalidAuthenticityToken错误,例如(实现Rails教程书的注册/登录流程)。
<%= form_for(@user, url: 'signup') do |f| %>
     <%= render 'partials/error_messages' %>
     <%= f.label :name, "Nimi" %>
     <%= f.text_field :name %>
     <%= f.label :email, "E-mail" %>
     <%= f.email_field :email %>
     <%= f.label :password, "Parool" %>
     <%= f.password_field :password %>
     <%= f.label :password_confirmation, "Korda parooli" %>
     <%= f.password_field :password_confirmation %>
     <%= f.submit "Loo konto", class: "button-green" %>
<% end %>

这种情况发生在所有表单中,输出转储的样子如下。

Dumps

application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title>Storebase - kaasaegsed e-poed!</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= stylesheet_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body class="bg-gray-100 text-gray-900">
    <% flash.each do |message_type, message| %>
      <div class="bg-blue-100 text-blue-500 flex items-center h-12 px-12 shadow-lg flash-<%= message_type %>"><%= message %></div>
    <% end %>

    <%= yield %>
    <%= debug(params) if Rails.env.development? %>
  </body>
</html>

我该怎么办?


1
你可以分享一下application.html.erb文件吗? - Dipak Gupta
@DipakGupta 已添加 :) - Rando Hinn
1
@RandoHinn 针对 skip_before_action :verify_authenticity_token, only:[:index, :show] 这段代码,您有什么看法? - cnnr
@cnnr 这个有多安全?skip_before_action :verify_authenticity_token, only:[:create]确实可以工作,但这样做会不会让我的登录面临攻击风险? - Rando Hinn
@RandoHinn,你不应该跳过create操作的令牌验证,因为这是很危险的。请同时添加你的控制器和application_controller - cnnr
@RandoHinn,你在使用 devise 的 自定义控制器 吗?(我也遇到了你描述的问题,想知道自定义控制器是否与此有关) - stevec
1个回答

3

在一个继承了Devise的控制器中,我发现了这个问题,它只在:destroy动作中出现。

class MySessionsController < Devise::SessionsController
  after_action :after_login,  only: [:create]
  after_action :after_logout, only: [:destroy]

  private

  def after_login
  end

  def after_logout
  end

我认为在删除操作中跳过验证并没有任何风险,因此将以下内容添加到控制器中可以解决这个问题:skip_before_action :verify_authenticity_token, only:[:destroy]。¯\_(ツ)_/¯

这是由Rails6升级引入的一个错误还是特性?如果跳过验证会存在安全风险吗?欢迎提供任何见解 :)


5
我看到没有人回答,我正在尝试升级到Rails 6时遇到同样的问题。你是否找到了有关此问题的解释? - Laurent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接