【问题标题】:With rails audits gem, can we add an audit manually?使用 rails audits gem,我们可以手动添加审核吗?
【发布时间】:2021-04-19 01:22:18
【问题描述】:
我注意到设计使用(在引擎盖下)本质上是对用户的 update_all,以增加 failed_attempts。这意味着用户对象上没有 after_commit 钩子,因此审核的 gem 不会记录 devise 所做的更改。
从技术上讲,记录确实发生了变化,记录失败的登录尝试日志会非常有用。
有没有“好”的方法来添加审计记录?即使我可以通过对错误尝试的评论来做到这一点
寻找最佳实践。
【问题讨论】:
标签:
ruby-on-rails
devise
audit
【解决方案1】:
一般而言,有几种方法可以在 audited 甚至没有注意到的情况下更改数据 - update_all、connection.execute,来自复杂应用程序中的非 Rails 进程,通过存储过程/触发器在数据库本身内。因此,在 rails/gem 级别没有通用的解决方案(除了基于触发器的数据库本身)。
对于您的特定任务 - 您可以使用warden 的before_failure 回调(设计在warden 之上运行,请参阅warden wiki 以获取回调文档),例如:
Warden::Manager.before_failure do |env, opts|
request = Rack::Request.new(env)
user = User.find_by(email: request.params[:email]) # not sure about param name
if user
user.audits.create(action: "update", audit_comment: "failed login from ...")
end
end
但请注意,这可能会使您的应用容易受到定时攻击 - 因为 db write 应用会以正确的电子邮件和错误的密码来响应尝试,因此攻击者可以检测到有效的电子邮件