Ответ 1
После нескольких минут выстрела, я понял, что это способ сделать это:
filters = Rails.application.config.filter_parameters
f = ActionDispatch::Http::ParameterFilter.new filters
f.filter :password => 'haha' # => {:password=>"[FILTERED]"}
Как я могу вручную фильтровать хеш с помощью фильтра параметров приложения?
Я предполагаю, что это будет так:
Rails.application.filter :password => 'pass1234'
# => {:password => '[FILTERED]'}
EDIT (пояснение): Я знаю, что Rails фильтрует хэш params
при записи в журналы. То, что я хочу сделать, это применить тот же фильтр к другому хэшу в моей прерогативе, прежде чем записывать его в журналы с чем-то вроде Rails.logger.info
. Я вызываю удаленный HTTP-запрос как часть моего приложения (поскольку большая часть бэкэнд работает через удаленный API), и я регистрирую URL и переданные параметры. Я хочу иметь журналы, но также убедиться, что там не обнаружено ни одного из чувствительных параметров.
После нескольких минут выстрела, я понял, что это способ сделать это:
filters = Rails.application.config.filter_parameters
f = ActionDispatch::Http::ParameterFilter.new filters
f.filter :password => 'haha' # => {:password=>"[FILTERED]"}
Смотрите файл config/application.rb
, к концу есть строка:
config.filter_parameters += [:password]
Таким образом, параметр "пароль" не будет отображаться в журналах, но вы все равно можете получить доступ к обычному значению.
Edit
Кажется, что вы неправильно поняли свой смысл "фильтра". Что касается уточненной проблемы, я понятия не имею, как обращаться с ней по-настоящему Rails.
Вот подход грубой силы:
CGI::parse(URI.parse(my_url_address_with_params).query)
, чтобы получить хэш из параметров/значений (обратите внимание: значения фактически хранятся как массив, вот обсуждение).*filtered*
.Rails.logger.info
(или debug
) непосредственно в журнал.Вот что вам нужно вникать, полагаясь на магические классы и методы Rails:
В Rails 3 код, который выполняет трюк, кажется, живет в ActionDispatch::Http
(ParameterFilter
в частности, метод `filter_parameters '). Документацию можно найти в API Dock (или, если честно, очень небольшая документация). Вы можете изучить источники, чтобы понять, как это работает.
Мои знания о внутренних компонентах Rails недостаточно хороши, чтобы предложить что-нибудь еще. Я считаю, что кто-то с лучшим пониманием этого может оказать большую помощь.
Основываясь на ответе Стивена Сюй выше, я сделал этот инициализатор в своем приложении 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]"
}