如何使用我的应用程序的参数过滤器手动过滤哈希?
我想它会像这样:
Rails.application.filter :password => 'pass1234'
# => {:password => '[FILTERED]'}
编辑(澄清):我知道Rails在写入日志时会过滤params
哈希。我想要做的是将相同的过滤器应用于我的特权的不同散列,然后用Rails.logger.info
之类的内容将其写入日志。我正在调用远程HTTP查询作为我的应用程序的一部分(因为大多数后端通过远程API操作),并且我正在记录传递的URL和参数。我想拥有日志,但也确保没有敏感的参数出现在那里。
答案 0 :(得分:48)
经过几分钟的枪击后,我发现这是做到这一点的方法:
filters = Rails.application.config.filter_parameters
f = ActionDispatch::Http::ParameterFilter.new filters
f.filter :password => 'haha' # => {:password=>"[FILTERED]"}
答案 1 :(得分:19)
请参阅config/application.rb
文件,最后有一行:
config.filter_parameters += [:password]
这样“密码”参数不会显示在日志中,但您仍然可以正常访问该值。
修改强>
似乎最初误解了“过滤器”的含义。至于澄清的问题,我不知道如何处理真正的Rails方式。
这是一种蛮力方法:
CGI::parse(URI.parse(my_url_address_with_params).query)
解析查询以获取param / values的哈希值(注意:值实际存储为数组; here is the discussion)。*filtered*
替换值。Rails.logger.info
(或debug
)进行记录。以下是依赖Rails魔法类和方法时应该深入研究的内容:
在Rails 3中,执行该技巧的代码似乎存在于ActionDispatch::Http
(特别是ParameterFilter
,方法`filtered_parameters')。该文档可在API Dock获得(或者,说实话,非常小文档)。您可以查看来源以了解其工作原理。
我对Rails内部的了解不足以提出任何其他建议。我相信有更好理解它的人可能会有更多的帮助。
答案 2 :(得分:2)
在Steven Xu的上述答案的基础上,我在我的rails应用程序中创建了这个初始化程序:
class ActionController::Parameters
def filtered
ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters).filter(self)
end
end
让我打电话给params.filtered
[1] pry(#<LessonsController>)> params.filtered
{
"controller" => "lessons",
"action" => "search",
"locale" => "en"
}
[2] pry(#<LessonsController>)> params[:password] = "bob"
"bob"
[3] pry(#<LessonsController>)> params.filtered
{
"controller" => "lessons",
"action" => "search",
"locale" => "en",
"password" => "[FILTERED]"
}