禁用特定操作的强参数
Posted
技术标签:
【中文标题】禁用特定操作的强参数【英文标题】:Disable strong parameters for a specific action 【发布时间】:2015-08-11 03:29:46 【问题描述】:我对强参数有一个严重的问题。它在我的大约 200 个动作中运行良好,但在一个动作中却没有,因为我正在使用那里的参数非常动态,而且由于应用程序设计,我也无法更改它。
所以我想在这个特定的操作中禁用强参数验证。有没有办法做到这一点?
【问题讨论】:
为什么不能在这个特定的地方使用if
???
因为我不知道参数将如何命名。我的行动基于元编程......
【参考方案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 的操作更容易以上是关于禁用特定操作的强参数的主要内容,如果未能解决你的问题,请参考以下文章