Разработать: Регистрация попыток входа в систему - PullRequest
4 голосов
/ 17 ноября 2011

У меня есть проект Rails 3.0, использующий devise , и меня просили регистрироваться в БД при каждом успешном входе в систему и при каждой неудачной попытке.

Из документации devise Думаю, мне придется расширить FailureApp, но примеры просто перенаправляют пользователей и вообще не используют модель. В stackoverflow Я только что нашел этот вопрос , но он остался без ответа, что не внушает оптимизма

Может кто-нибудь сказать мне, прав ли я в этом подходе, или это невозможно сделать таким образом, или есть какая-то более простая альтернатива, которую я упускаю?

(я знаю, что кода пока нет, я просто ищу небольшое руководство, прежде чем погрузиться)

Спасибо.

Ответы [ 3 ]

4 голосов
/ 27 июня 2012

Потратил немного времени на то, чтобы разобраться в этом сам, и подумал, что кто-то еще может найти это полезным.

Действие create в контроллере devise вызывает warden.authenticate!, которое пытается аутентифицировать пользователя с помощью предоставленных параметров. Если аутентификация не удалась, authenticate! вызовет приложение сбоя устройства, которое затем запустит действие SessionsController#new. Обратите внимание, что любые фильтры, которые вы используете для действия create, не будут работать, если аутентификация не пройдена.

Таким образом, решение заключается в добавлении фильтра после действия new, который проверяет содержимое env["warden.options"] и выполняет соответствующее действие.

, например

def instrument_failed_login
  instrument "failed_login.staff" if failed_login?
end

def failed_login?
  (options = env["warden.options"]) && options[:action] == "unauthenticated"
end
3 голосов
/ 24 ноября 2014

Альтернативный и более понятный способ добавления журналирования при аутентификации Devise - это использование Warden Callbacks в инициализаторе.Это предпочтительно, потому что он использует API Warden, разработанный для этого, и не включает копирование / вставку кода контроллера.

Warden::Manager.before_failure do |env, opts|
    logger.error("opts[:scope] authentication failure: #{opts[:message]}")
end

Вы можете сделать то же самое с Warden::Manager#after_authentication и Warden::Manager#before_logout.

3 голосов
/ 17 ноября 2011

Модификация Devise :: SessionsController для выполнения вашей грязной работы поможет вам.

Просто скопируйте этот файл в ваше приложение / controllers / devise / session_controller.rb

Как только вы это сделалипросто добавьте некоторый код туда, где пользователь успешно вошел в систему и где он не смог войти, и он сделает то, что вы хотите.

Возможно, вы захотите создать новую модель для отслеживания записей входа в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...