如何在rails中过滤参数?

Rails内置了日志过滤function,因此您不需要login密码和信用卡。 非常适用,但是当你想触发自定义日志(比如发邮件)并发送你自己的params或其他数据的时候,参数显然不是自动过滤的。 我一直在挖掘,试图find这个在轨道来源,但迄今没有运气。

我已经configuration轨道来过滤参数如下,它适用于保持轨道日志数据:

config.filter_parameters += [:password, :password_confirmation, :credit_card] 

在将数据转储到电子邮件,API调用或自定义(非导轨)日志之前,如何过滤params散列中的敏感数据?

您始终可以使用except方法:

 params.except(:password, :password_confirmation, :credit_card) 

这将排除他们的名单。 要“过滤”他们,你可以尝试这种方法 。

Rails 4+

用于在Rails 4+中过滤日志的config.filter_parametersconfig.filter_parameters已经从application.rb移动到它自己的初始化程序。

configuration/初始化/ filter_parameter_logging.rb

 Rails.application.config.filter_parameters += [:password] 

tadman回答正确,但这里有一些额外的信息:

在application.rb中

 config.filter_parameters += [:password, :password_confirmation, :credit_card] 

无论你在做什么自定义日志logging:

 f = ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters) f.filter :order => {:credit_card => "4111111111111111"} => {:order=>{:credit_card=>"[FILTERED]"}} 

如果你在轨道控制器的方法,为什么不只是调用request.filtered_parameters

使用已经提供的东西总是一个不错的select。 干杯!

只需添加@tadman答案:

使用except ,请注意,它只会删除参数的顶级密钥,例如:

 params = { search_query: 'foobar', secret_key1: 'SENSITIVE_KEY_1', auth_info: {secret_key_2: 'SENSITIVE_KEY2'} } params.except(:secret_key1, :secret_key2) => {:search_query=>"foobar", :auth_info=>{:secret_key_2=>"SENSITIVE_KEY2"}} 

使用request.filtered_parameters将过滤这两个键,如果他们在config / application.rb

 config.filter_parameters += [:password]