【问题标题】:Disable strong parameters for a specific action禁用特定操作的强参数
【发布时间】:2015-08-11 03:29:46
【问题描述】:

我对强参数有一个严重的问题。它在我的大约 200 个动作中运行良好,但在一个动作中却没有,因为我正在使用那里的参数非常动态,而且由于应用程序设计,我也无法更改它。

所以我想在这个特定的操作中禁用强参数验证。有没有办法做到这一点?

【问题讨论】:

  • 为什么不能在这个特定的地方使用if???
  • 因为我不知道参数将如何命名。我的行动基于元编程......

标签: ruby-on-rails strong-parameters ruby-on-rails-4.2


【解决方案1】:

不太确定这是否是最佳实践,但对于 Rails 5,我只使用 request.params 而不是 params,只要我想跳过强参数。

所以不要像这样:

post = Post.new(params[:post])

我用:

post = Post.new(request.params[:post])

【讨论】:

    【解决方案2】:

    强参数覆盖ActionController::Base 中的params 方法。您可以简单地覆盖它并将其设置回您自己想要的。

    所以这个:

    class MyController < ApplicationController
      def params
        request.parameters
      end
    end
    

    将有效禁用控制器中所有操作的强参数。您只想为特定操作禁用它,因此您可以这样做:

    class MyController < ApplicationController
      before_action :use_unsafe_params, only: [:particular_action]
    
      def params
        @_dangerous_params || super
      end
    
      def particular_action
        # My params is unsafe
      end
    
      def normal_action
        # my params is safe
      end
    
      private
    
      def use_unsafe_params
        @_dangerous_params = request.parameters
      end
    end
    

    【讨论】:

      【解决方案3】:

      您可以使用.permit! 将哈希中的任何键列入白名单。

      params.require(:something).permit!
      

      但是,这应该被视为极端的代码异味和安全风险。

      嵌套哈希可以通过这个技巧被列入白名单:

      params.require(:product).permit(:name, data: params[:product][:data].try(:keys))
      

      【讨论】:

      • 这对我不起作用,因为参数的名称不是静态定义的,它们是由显示的对象定义的。我知道这听起来像是一个很大的安全漏洞,但我在方法逻辑中实现了安全机制。我真的需要在一个动作中关闭强参数
      • 我能想到使用config.action_controller.permit_all_parameters 的唯一方法,但这是在每个应用程序的基础上完成的。不是每次操作。
      • 是的,对于开发模式,我禁用了强参数,但在生产模式下我不能这样做
      • 您可以创建某种函数,递归遍历参数哈希并将其列入白名单。但是我不能给你一个例子,因为我不知道你的控制器是什么样子的。
      • 我认为修改强参数 gem 的方式允许禁用特定于 gem 的操作更容易
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多