手动过滤Rails中的参数

Ste*_*ven 32 ruby-on-rails

我如何使用我的应用程序的参数过滤器手动过滤哈希?

我想它会是这样的:

Rails.application.filter :password => 'pass1234'
  # => {:password => '[FILTERED]'}
Run Code Online (Sandbox Code Playgroud)

编辑(澄清):我知道Rails params在写入日志时会过滤哈希值.我想要做的是将相同的过滤器应用于我的特权的不同散列,然后再将其写入日志Rails.logger.info.我正在调用远程HTTP查询作为我的应用程序的一部分(因为大多数后端通过远程API操作),并且我正在记录传递的URL和参数.我想拥有日志,但也确保没有敏感的参数出现在那里.

Ste*_*ven 52

经过几分钟的游戏后,我发现这是做到这一点的方法:

filters = Rails.application.config.filter_parameters
f = ActionDispatch::Http::ParameterFilter.new filters
f.filter :password => 'haha' # => {:password=>"[FILTERED]"}
Run Code Online (Sandbox Code Playgroud)


Sor*_*row 22

看到config/application.rb文件,到最后有一行:

config.filter_parameters += [:password]
Run Code Online (Sandbox Code Playgroud)

这样,"密码"参数不会显示在日志中,但您仍然可以正常访问该值.

编辑

似乎最初误解了"过滤器"的含义.至于澄清的问题,我不知道如何处理真正的Rails方式.

这是一种蛮力方法:

  1. 解析查询CGI::parse(URI.parse(my_url_address_with_params).query)以获取param/values的哈希值(注意:值实际存储为数组; 这里是讨论).
  2. 找到要过滤的参数,并用文字替换值*filtered*.
  3. 直接调用Rails.logger.info(或debug)记录.

以下是依赖Rails魔法类和方法时应该深入研究的内容:

在Rails 3中,执行该技巧的代码似乎存在ActionDispatch::Http(ParameterFilter特别是方法`filtered_pa​​rameters').该文档可在API码头(或,说实话,非常小的文档).您可以检查源以了解其工作原理.

我对Rails内部的了解不足以提出任何其他建议.我相信有更好理解它的人可能会有更多的帮助.