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

发布于 2024-09-26 21:40:36 字数 146 浏览 2 评论 0原文

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

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

I'm using Devise for authentication in my rails app and I'd like to be able to block certain accounts and prevent users from reregistering with a blocked email. I'm just not sure what the best way is to go about it.

My first thought was to override the sessions and registrations controllers to check the model for a user with a blocked bit, but I have a feeling there might be a more elegant way.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

怎会甘心 2024-10-03 21:40:36

最好的方法是以 Devise 方式 进行:

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

1.实现account_active?方法。

在用户表中添加布尔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_outredirect_to 用户。

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

更多:devise/authenticable.rb

The best approach is to do it in Devise way:

Below assumes that you are using Devise database_authenticatable module and your application's users model names User.

1. Implement an account_active? method.

Add boolean account_active column in users table or define account_active? method in User model (you can chose your own method name). For example:

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

2. Overwrite the active_for_authentication? method in your model (User).

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

3. Add method which returns translation for flash message.

Whenever active_for_authentication? returns false, Devise asks the reason why your model is inactive using the inactive_message method.

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

And that's it. You don't need to care about sign_out or redirect_to user.

Moreover, user is locked immediately, with next request, not after next sign in.

More: devise/authenticatable.rb.

榆西 2024-10-03 21:40:36

我会这样做:

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

I would do it like this:

def after_sign_in_path_for(resource)
  if resource.is_a?(User) && resource.banned?
    sign_out resource
    banned_user_path
  else
   super
  end
end
宁愿没拥抱 2024-10-03 21:40:36

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

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

A better solution is to override the active_for_authentication? method on the devise model (User). Like so:

    def active_for_authentication?
      super && !self.banned?
    end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文