2011-11-17 2 views
3

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

От DEViSE документации Я думаю, что я должен был бы расширить FailureApp но примеры просто перенаправлять пользователей, а не с помощью модели вообще. В StackOverflow Я только что нашел this question, но она осталась без ответа, который не поощряет

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

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

Спасибо.

ответ

3

Модифицировать разработку :: SessionController, чтобы сделать вашу грязную работу, сделает трюк.

Просто скопируйте этот файл в ваше приложение/контроллеры/изобрести/sessions_controller.rb

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

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

+0

Спасибо, что найти, как сделать перехват неудавшегося attemp было сложно, но, похоже, он работает. – madth3

+0

Я рад, что могу указать вам в правильном направлении. – fivetwentysix

4

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

Действие create в контроллере разработки вызывает 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 
+0

Спасибо @Matt; это было полезно. Следуйте инструкциям здесь, чтобы локально реализовать ведение журнала неудачных логинов. Кроме того, описаны действия в этом ответе: http://stackoverflow.com/a/12877182/429758 –

3

Альтернативные и более ремонтопригоден способ добавления протоколирования вокруг аутентификации 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.

Смежные вопросы