Ruby on rails 使用Desive for Rails禁止/阻止用户的最佳方法是什么?

Ruby on rails 使用Desive for Rails禁止/阻止用户的最佳方法是什么?,ruby-on-rails,ruby,authentication,registration,devise,Ruby On Rails,Ruby,Authentication,Registration,Devise,我在rails应用程序中使用Desive进行身份验证,我希望能够阻止某些帐户,并防止用户使用被阻止的电子邮件重新注册。我只是不知道最好的办法是什么 我的第一个想法是覆盖会话和注册控制器,以检查具有阻塞位的用户的模型,但我觉得可能有一种更优雅的方法。我会这样做: def after_sign_in_path_for(resource) if resource.is_a?(User) && resource.banned? sign_out resource ba

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


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

我会这样做:

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

更好的解决方案是覆盖活动的\u以进行\u身份验证?设计模型(用户)上的方法。像这样:

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

最好的方法是用设计的方法来做:

下面假设您正在使用Desive database_authenticatable模块,并且应用程序的用户模型名为User

1。是否启用一个帐户?方法。

    # app/models/user.rb
    def active_for_authentication?
      super && account_active?
    end
在用户表中添加布尔值
account\u active
列,或在用户模型中定义
account\u active?
方法(您可以选择自己的方法名称)。例如:

    # app/models/user.rb
    def account_active?
      blocked_at.nil?
    end
2。覆盖型号(用户)中的
活动\u以进行身份验证?
方法。

    # app/models/user.rb
    def active_for_authentication?
      super && account_active?
    end
3。添加返回flash消息翻译的方法。

    # app/models/user.rb
    def active_for_authentication?
      super && account_active?
    end
无论何时
active\u for\u authentication?
返回false,designe都会使用
inactive\u消息
方法询问您的模型处于非活动状态的原因

    # app/models/user.rb 
    def inactive_message
      account_active? ? super : :locked
    end
就这样。您不需要关心
注销
重定向到
用户

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


更多信息:。

请注意,这有一个缺点:如果用户在登录时被禁止,则在他们注销并再次登录(可能需要很长时间)之前,禁令不会生效。因此,要么在您禁止用户登录时强制用户注销,或者将此逻辑移动到控制器中的
操作前
,而不是在
的路径中使用
签名后。当您禁止该用户时,只需再添加一行以记录其输出。请告诉每个代码块的每个文件是什么?@AymanSalah已按要求完成。这三种方法都需要放在
app/models/user.rb中(假设user.rb是您负责应用程序用户的模型),并且工作正常!