2016-06-21 55 views
3

作为事实上的标准,我们都使用Devise登录Rails应用程序,并使用Lockable模块在特定数量的失败的尝试。用Devise for Rails锁定每个用户使用每个用户的`maximum_attempts`值

从Devise的source code和配置选项config.maximum_attempts = 20,我开始理解当用户试图给出错误的登录凭证时Devise如何执行锁定。配置在initializers的Rails应用程序启动时间被静态定义。

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

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

+0

对于每个用户?你为什么要这样的行为?如果您获得了1000位用户,该怎么办?你想单独管理他们所有的人吗? –

+1

是@TheCha͢mp,Superadmin1可能有1000个用户,并且对于所有这1000个用户,failed_login_attempt应该是ex:3,super admin2可能有5个作为failed_login_attempt ... –

+0

它似乎有很多工作很少有收获......为什么不设置全球?我想这取决于你... –

回答

1

一种可能的方法是猴子修补you linked to,其中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::Models::Lockable的文档提到了一个公开的方法lock_access!,用于在您调用时锁定用户。您可以将全局config.maximum_attempts设置为一些非常高的值,例如25.然后,在模型的某个回调中(我不确定哪个回调),请根据您的自定义规则调用方法lock_access_based_on_superadmin_limit!,根据需要调用lock_access!。以下定义适用于part of Devise’s 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 
+0

@ rory-okane感谢您的简要解释。我也认为第一次尝试,并完全同意与猴子修补问题...再次感谢 –

+0

如何处理数字设计节目,如剩余的x attepts,或者如果我们在设计配置中启用config.last_attempt_warning = true,我们将如何处理这个(事情? –

+0

@FerdinandRosario你有没有得到这个工作满意吗?我正在研究同样的事情,并试图弄清楚这种回调应该在哪里完成。 – CChandler81