使用Devise for Rails禁止/阻止用户的最佳方法是什么?

时间:2010-10-08 23:14:14

标签: ruby-on-rails ruby authentication registration devise

我在我的rails应用程序中使用Devise进行身份验证,我希望能够阻止某些帐户并阻止用户使用阻止的电子邮件重新注册。我只是不确定最好的方法是什么。

我的第一个想法是覆盖会话和注册控制器以检查具有阻塞位的用户的模型,但我感觉可能有更优雅的方式。

5 个答案:

答案 0 :(得分:23)

最好的方法是以设计方式

进行

下面假设您正在使用Devise database_authenticable模块,而您的应用程序的用户模型名称为User。

<强> 1。实施 account_active?方法。

在users表中添加布尔account_active列或在User模型中定义account_active?方法(您可以选择自己的方法名称)。例如:

    # app/models/user.rb
    def account_active?
      blocked_at.nil?
    end

<强> 2。覆盖模型中的active_for_authentication?方法(用户)。

    # app/models/user.rb
    def active_for_authentication?
      super && account_active?
    end

第3。添加方法,返回flash消息的翻译。

每当active_for_authentication?返回false时,Devise会使用inactive_message方法询问您的模型处于非活动状态的原因。

    # app/models/user.rb 
    def inactive_message
      account_active? ? super : :locked
    end

就是这样。您不需要关心sign_outredirect_to用户。

此外,用户会在下次请求时立即锁定,而不是在下次登录后锁定。

更多:devise/authenticatable.rb

答案 1 :(得分:11)

我会这样做:

def after_sign_in_path_for(resource)
  if resource.is_a?(User) && resource.banned?
    sign_out resource
    banned_user_path
  else
   super
  end
end

答案 2 :(得分:5)

更好的解决方案是覆盖active_for_authentication?设计模型上的方法(用户)。像这样:

    def active_for_authentication?
      super && !self.banned?
    end

答案 3 :(得分:2)

更优雅的方法是覆盖(用户)控制器的find_for_authentication方法,仅为未阻止的用户确定范围。这样,尝试以被阻止的用户身份登录就像尝试以不存在的用户身份登录一样。 (如果你想告诉用户她被阻止了,你也可以在这里设置一个闪光警报。 Here's a good run-through

答案 4 :(得分:0)

您可以在用户模型中创建custom validation method,在创建时,会检查该电子邮件是否在阻止的电子邮件列表中。