Ruby on rails 使用Desive for Rails禁止/阻止用户的最佳方法是什么?
我在rails应用程序中使用Desive进行身份验证,我希望能够阻止某些帐户,并防止用户使用被阻止的电子邮件重新注册。我只是不知道最好的办法是什么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
我的第一个想法是覆盖会话和注册控制器,以检查具有阻塞位的用户的模型,但我觉得可能有一种更优雅的方法。我会这样做:
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是您负责应用程序用户的模型),并且工作正常!