我可以自定义Rails过滤参数的方式吗?

时间:2015-02-09 16:48:42

标签: ruby-on-rails parameters

我想过滤某些用户信息,以便不在日志中捕获敏感信息。但是,在一种情况下,我想记录格式而不是默认格式"[FILTERED]"

例如,我想进行这种转变:

# user input    value to log
"e6132 DG71" => "a9999 AA99"

这有助于我们排查用户问题。的问题。

我可以为Rails'使用自定义过滤器(也许是proc?) filter_parameters方法?

2 个答案:

答案 0 :(得分:4)

附加一个lambda过滤器

您可以将lambda过滤器附加到Rails.application.config.filter_parameters。只有未通过典型过滤捕获的参数才会继续进行自定义过滤。

# Typical filters - will show as [FILTERED]
Rails.application.config.filter_parameters += [
  :password
]

# Custom filter - this only sees what the previous list didn't catch
Rails.application.config.filter_parameters << lambda do |param_name, value|
  if %w[foo_param bar_param].include?(param_name) && value.respond_to?(:gsub!)
    # Alter the string in place because we don't have access to 
    # the hash to update the key's value
    value.gsub!(/[a-z]/, "a")
    value.gsub!(/[A-Z]/, "A")
    value.gsub!(/[0-9]/, "9")
    # Stick this at the beginning to make it easy to see in logs
    value.gsub!(/\A/, "[FORMAT FILTERED]")
  end
end

请注意,默认过滤器与正则表达式匹配; :password被视为/password/。您也可以为自定义过滤器执行此操作:

if [/foo/, /bar/].detect {|r| r.match(param_name) }
  # ...
end

答案 1 :(得分:1)

读取Rails 4.2的ActionDispatch::Http::FilterParameters docs,可以选择将块传递给parameter_filter以自定义过滤器行为。我假设你可以这样做:

 env["action_dispatch.parameter_filter"] = lambda do |k,v|
   your_transformation(v) if k =~ /secret/i
 end

其中your_transformation知道如何处理标记为secret的用户输入,以将其转换为a9999 AA99。我猜你也必须处理你现有的filtered_attributes以保持[FILTERED]行为。