Rails 6 - 常量 ActionController::InvalidAuthenticityToken

Posted

技术标签:

【中文标题】Rails 6 - 常量 ActionController::InvalidAuthenticityToken【英文标题】:Rails 6 - constant ActionController::InvalidAuthenticityToken 【发布时间】:2019-12-25 14:27:00 【问题描述】:

我正在修改 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 %>

这发生在所有表单上,输出转储看起来像这样

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>

我该怎么办?

【问题讨论】:

可以分享application.html.erb吗? @DipakGupta 添加:) @RandoHinn skip_before_action :verify_authenticity_token, only:[:index, :show] 呢? @cnnr 这有多安全? `skip_before_action :verify_authenticity_token, only:[:create]` 确实有效,但这不会让我的登录受到攻击吗? @RandoHinn 对于create 操作,您不应该跳过令牌验证,因为这很危险。请将您的控制器添加到创建操作和application_controller 【参考方案1】:

在一个控制器中看到了这一点,该控制器是 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 升级引入的错误或功能吗?是否存在我通过跳过看不到的安全风险?任何见解将不胜感激:)

【讨论】:

我看到没有人回答,我在尝试升级到 Rails 6 时遇到了同样的问题。你有没有找到关于这个问题的解释?

以上是关于Rails 6 - 常量 ActionController::InvalidAuthenticityToken的主要内容,如果未能解决你的问题,请参考以下文章

Ruby/Rails 的神秘“未定义常量”问题

CentOS 6.6 上 Ruby 的“未初始化常量 OpenSSL::PKey::EC”

Rails:NameError:未初始化的常量

Rails 控制台:无法自动加载常量

rails 链接表“未初始化的常量”错误

Rails:NameError(未初始化的常量 UserSerializer)