使用Devise for Rails禁止/阻止用户的最佳方法是什么?
我在我的rails应用程序中使用Devise进行身份validation,我希望能够阻止某些帐户并阻止用户使用阻止的电子邮件重新注册。 我只是不确定最好的方法是什么。
我的第一个想法是覆盖会话和注册控制器来检查具有阻塞位的用户的模型,但我感觉可能有更优雅的方式。
我会这样做:
def after_sign_in_path_for(resource) if resource.is_a?(User) && resource.banned? sign_out resource banned_user_path else super end end
最好的方法是以Devise方式完成 :
下面假设您正在使用Devise database_authenticable模块,并且您的应用程序的用户模型名称为User。
1.实施account_active? 方法。
在users表中添加boolean account_active
列或定义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_out
或redirect_to
用户。
此外,用户会在下次请求时立即锁定,而不是在下次登录后锁定。
更多: devise / authenticatable.rb 。
更好的解决方案是覆盖active_for_authentication? 设计模型上的方法(用户)。 像这样:
def active_for_authentication? super && !self.banned? end
更优雅的方法是覆盖(用户)控制器的find_for_authentication方法,仅为未阻止的用户确定范围。 这样,尝试以被阻止的用户身份登录就像尝试以不存在的用户身份登录一样。 (如果你想告诉用户她被阻止了,你也可以在这里设置一个闪光警报。 这是一个很好的运行 。
您可以在用户模型中创建自定义validation方法 ,在创建时,该方法会检查电子邮件是否在阻止的电子邮件列表中。