我有一个使用 设计 的Rails 3.0项目,并且我已被要求在每次成功登录和每次失败尝试时都在DB中注册。
从 设计 文档中我认为我必须扩展FailureApp
,但这些示例只是重定向用户而根本不使用模型。在 stackoverflow 中,我刚刚找到了this question,但它仍未得到答复,这并不令人鼓舞
任何人都可以告诉我,如果我在这种方法中是正确的,或者不能以这种方式完成,或者如果有一些更容易的替代方案我会丢失吗?
(我知道还没有代码,我只是在潜水前寻找一个小指导)
感谢。
答案 0 :(得分:4)
花了一点时间自己研究一下,并认为其他人可能觉得这很有用。
设计控制器中的创建操作调用warden.authenticate!
,它尝试使用提供的参数对用户进行身份验证。如果身份验证失败,则authenticate!
将调用设计失败应用程序,然后该应用程序将运行SessionsController#new
操作。请注意,如果身份验证失败,您对create
操作的所有过滤器都将无法运行。
因此解决方案是在new
操作之后添加一个过滤器,该操作会检查env["warden.options"]
的内容并采取相应的操作。
e.g。
def instrument_failed_login
instrument "failed_login.staff" if failed_login?
end
def failed_login?
(options = env["warden.options"]) && options[:action] == "unauthenticated"
end
答案 1 :(得分:3)
修改Devise :: SessionsController来做你的肮脏工作就可以了。
只需将该文件复制到app / controllers / devise / sessions_controller.rb
即可完成上述操作后,只需在用户成功登录的位置添加一些代码,以及无法登录的位置即可执行您想要的操作。
您可能想要创建一个用于跟踪登录记录的新模型。
答案 2 :(得分:3)
在Devise身份验证中添加日志记录的另一种更易于维护的方法是在初始化程序中使用Warden Callbacks。这是首选,因为它使用专为此设计的Warden API,并且不涉及复制/粘贴控制器代码。
Warden::Manager.before_failure do |env, opts|
logger.error("opts[:scope] authentication failure: #{opts[:message]}")
end
您可以对Warden::Manager#after_authentication
和Warden::Manager#before_logout
执行相同操作。