繁体   English   中英

使用Devise for Rails使用每用户“maximum_attempts”值锁定用户

[英]Locking a user using a per-user `maximum_attempts` value with Devise for Rails

作为事实上的标准,我们都在我们的Rails应用程序中使用Devise登录,并且在特定次数的失败尝试之后将使用Lockable模块锁定用户。

从Devise的源代码和配置选项config.maximum_attempts = 20 ,我开始了解当用户尝试提供错误的登录凭据时Devise如何执行锁定。 配置是在initializers程序中的Rails应用程序启动时静态定义的。

我的期望是动态设置maximum_attempts - 这可能吗? 如果是这样,请指导我。

我在每个管理员下面都有一个superadmin和用户。 基于超级管理员,我想在运行时为每个用户设置不同的failed_attempt值。

一种可能的方法是修补你链接到的Devise代码,其中的attempts_exceeded? 被定义为。 以下是对需要覆盖的内容的猜测:

module Devise::Models::Lockable
  # assumes that the User model has a `superadmin` relation
  #  that has a `maximum_attempts` attribute

  def attempts_exceeded?        
    self.failed_attempts >= self.superadmin.maximum_attempts
  end

  def last_attempt?
    self.failed_attempts == self.superadmin.maximum_attempts - 1
  end
end

这应该可行,但这意味着无论何时更新Devise,都存在相关代码中断的风险,并带来未知后果。 因此,您必须在每次更新之前查看对Devise的更改。 如果由于这一点而不鼓励更新Devise,如果你太慢而无法更新到具有固定安全问题的Devise版本,那么最终可能会导致安全问题。 所以要小心那些可能的问题。

需要更多工作的更安全的方法是手动锁定用户自己的代码。 Devise::Models::Lockable的文档提到了一个公共方法lock_access! 当你调用它时会锁定用户。 您可以将全局config.maximum_attempts设置为某个非常高的值,例如25.然后,在模型的某些回调中(我不确定哪个回调),调用方法lock_access_based_on_superadmin_limit! 调用lock_access! 如有必要,根据您的自定义规则。 以下定义是根据Devise的valid_for_authentication?一部分改编valid_for_authentication?

class User
  # …

  def lock_access_based_on_superadmin_limit!
    if failed_attempts >= superadmin.maximum_attempts
      lock_access! unless access_locked?
    end
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM