设计 - 如何禁止某些用户登录?

Posted

技术标签:

【中文标题】设计 - 如何禁止某些用户登录?【英文标题】:Devise - How do I forbid certain users from signing in? 【发布时间】:2011-08-25 15:25:09 【问题描述】:

我在我的应用程序中使用 Devise 进行身份验证。

我如何禁止某些用户登录 - 有点禁用用户?

【问题讨论】:

这是一个有效的问题,应该重新打开 - OP 使用 devise 询问“我如何禁止某些用户登录”。 【参考方案1】:

您想要进行授权,而不是身份验证。不过,Devise 只进行身份验证。 IE。 devise 只告诉您用户就是他所说的那个人。 您需要其他东西来禁止他使用该网站。

授权是一个热门话题,有一整套可以帮助您的宝石:http://ruby-toolbox.com/categories/rails_authorization.html 任君挑选。

【讨论】:

我知道区别。问题是我想禁止用户登录,而不是访问某些控制器。【参考方案2】:

听起来你可能对康康舞感兴趣

https://github.com/ryanb/cancan http://railscasts.com/episodes/192-authorization-with-cancan

【讨论】:

这不是对所提问题的回答。大多数人都知道授权和身份验证之间的区别。问题是如何做到让用户无法登录。【参考方案3】:

这样做:

User 模型创建一个名为is_active 的列。

然后将下面的代码添加到User模型中:

class User < ActiveRecord::Base
  #this method is called by devise to check for "active" state of the model
  def active_for_authentication?
    #remember to call the super
    #then put our own check to determine "active" state using 
    #our own "is_active" column
    super and self.is_active?
  end
end

更新

正如 Matt Huggins 所说,该方法现在称为 active_for_authentication? (Documentation)

【讨论】:

看起来这已被重命名为 active_for_authentication? 而不仅仅是 active? the method is now called active_for_authentication? 表示你的方法名应该是active_for_authentication? 而不是active? 设计维基 - How to customize user account status validation when logging in 重要提示:active_for_authentication? 必须是公共方法! super and self.is_active?可以简化为super &amp;&amp; is_active?【参考方案4】:

User 模型添加一列:allowed_to_log_in

然后将此添加到/app/models/user.rb:

def active_for_authentication?
    super and self.allowed_to_log_in?
end

如果您想通过自定义消息通知用户,您也可以添加此消息:

def inactive_message
    "You are not allowed to log in."
end

我认为这很重要,因为来自 Devise 的标准信息说:

“您的帐户尚未激活。”

这让用户感到困惑,真正的原因是您已“禁止”他们登录。

【讨论】:

我正在实现一个用户暂停功能,但是现在用户注册也会显示 inactive_message“您的帐户当前被暂停”。我可以为新帐户激活和用户暂停提供不同的非活动消息吗? kiprosh.com/blog/… 感谢 inactive_message 的评论。

以上是关于设计 - 如何禁止某些用户登录?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 5:如何在登录前检查用户是不是被禁止

python 登录三次禁止登录

如何禁止用户访问 phpMyAdmin 登录页面? [复制]

java中如何获取用户的IP地址及禁止此人

小技巧当对服务器做大负荷操作,如何禁止普通用户登录

Rails - 如何覆盖设计SessionsController以在用户登录时执行特定任务?