我想过滤某些用户信息,以便不在日志中捕获敏感信息。但是,在一种情况下,我想记录格式而不是默认格式"[FILTERED]"
。
例如,我想进行这种转变:
# user input value to log
"e6132 DG71" => "a9999 AA99"
这有助于我们排查用户问题。的问题。
我可以为Rails'使用自定义过滤器(也许是proc?) filter_parameters
方法?
答案 0 :(得分:4)
您可以将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]
行为。