【问题标题】:Devise allowing all attributes by default in Rails 4在 Rails 4 中设计默认允许所有属性
【发布时间】:2014-01-17 16:18:57
【问题描述】:

我目前正在执行以下操作:

Rails 4.0.2
设计 3.2.2

在设计文档中,它指出强参数将默认阻止除以下属性之外的所有属性 - 电子邮件、密码、密码确认、当前密码。

我在我的注册设计视图中编辑了 new.html.erb 以包含三个附加属性 - first_name、last_name、profile_name,如下所示。

<h2>Sign up</h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>
  <div><%= f.label :first_name %><br />
    <%= f.text_field :first_name %></div>

  <div><%= f.label :last_name %><br />
    <%= f.text_field :last_name %></div>

  <div><%= f.label :profile_name %><br />
    <%= f.text_field :profile_name %></div>

  <div><%= f.label :email %><br />
  <%= f.email_field :email, :autofocus => true %></div>

  <div><%= f.label :password %><br />
  <%= f.password_field :password %></div>

  <div><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></div>

  <div><%= f.submit "Sign up" %></div>
<% end %>

<%= render "devise/shared/links" %>

由于某种原因,用户仍然可以通过在所有字段中输入信息来注册,甚至是我添加的新字段。默认情况下我的所有属性都被允许是有原因的吗?

我是编程新手,我正在学习我的第一个 Rails 教程,所以我确定我犯了一个完全明显的错误,但我无法弄清楚并且无法找到相同的问题通过在线搜索。

谢谢

【问题讨论】:

  • 检查记录是否包含您添加的列的值。我认为它们将具有 nil 值,因为它们无法绕过强参数
  • 是的,它的值是 'nil' 并且没有被添加到数据库中。谢谢!

标签: ruby-on-rails devise ruby-on-rails-4 strong-parameters


【解决方案1】:

宝石文件

gem "strong_parameters"

config/application.rb

config.active_record.whitelist_attributes = false

应用控制器

before_filter :configure_permitted_parameters, if: :devise_controller?


  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :first_name

  end

【讨论】:

    【解决方案2】:

    使用强参数时,客户端不会对字段是否允许进行隐式验证,但这些字段实际上不会保存到数据库中,直到您explicitly permit them in your controller。您应该能够通过在创建/更新操作期间观察您的服务器控制台来验证控制器是否阻止了这些字段。

    【讨论】:

    • 这就是正在发生的事情。我从记录中看到我添加的字段的值为“nil”。我期待客户端出现某种错误。
    【解决方案3】:

    用户可以输入,但不允许批量分配。以下内容来自 Devise README:

    如果您想允许附加参数(惰性方式™),您可以在 ApplicationController 中使用简单的前置过滤器:

    class ApplicationController < ActionController::Base
      before_filter :configure_permitted_parameters, if: :devise_controller?
    
      protected
    
      def configure_permitted_parameters
        devise_parameter_sanitizer.for(:sign_up) << :username
      end
    end
    

    在 Devise 的自述文件strong parameter section 上阅读更多相关信息。

    【讨论】:

    • 我添加了下面的代码,但它对我不起作用。我收到错误“电子邮件不能为空”和“密码不能为空”,即使它们都已输入。不确定我是否需要为此提出一个新问题...class ApplicationController &lt; ActionController::Base before_filter :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) &lt;&lt; :first_name devise_parameter_sanitizer.for(:sign_up) &lt;&lt; :last_name devise_parameter_sanitizer.for(:sign_up) &lt;&lt; :profile_name end end
    • 这只是一个例子。您需要找出要将哪个属性列入白名单。
    猜你喜欢
    • 2012-12-11
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多