Rails为某些用户类型设计了禁用密码恢复功能

时间:2015-03-09 10:58:21

标签: ruby-on-rails ruby ruby-on-rails-3 authentication devise

在我的Rails项目中,我有不同类型的用户,其中一个具有user_status :admin,与其他用户不同,它具有编辑内容的完全权限。出于显而易见的原因,我想为这些类型的用户添加额外的安全性,特别是完全禁用密码恢复。

覆盖标准Devise密码恢复(:recoverable设计模块)方法的正确方法是什么,以便当用户尝试为管理员用户(user_status == "admin"用户获取重置密码链接时)系统返回“未找到标准电子邮件”消息?

这有点像未回答的问题:Restrict Devise password recovery to only certain users

提前谢谢。

4 个答案:

答案 0 :(得分:7)

我选择的方法对我有用,它通过将以下内容添加到send_reset_password_instructions来覆盖用户模型的models/user.rb方法:

def send_reset_password_instructions
  return false if self.user_status == 'admin'
  super
end

这使得Devise在电子邮件属于管理员帐户时不会做任何事情。

答案 1 :(得分:1)

未经过测试,但我认为您可以覆盖用户模型中的reset_password!,如下所示:

def reset_password!(new_password, new_password_confirmation)
  return false if user_status == 'admin'
  super
end

如果用户是管理员,则可以防止重置密码。

我不知道这是否是最好的覆盖方法,有更多设计可恢复的方法可以在您的用户模型中被覆盖,即send_reset_password_instructions。检查manual是否有所有有趣的方法。

答案 2 :(得分:0)

对于任何将来的观看者,这是另一种实现方式。 Vitaly的示例确实对我有用,但是我仍然收到“您的密码电子邮件已发送”的信息。通知(我想闪烁一个单独的警报),所以我走了另一条路线。

扩展Devise :: PasswordsController对我来说是最简单的解决方案:

class Devise::Extends::PasswordsController < Devise::PasswordsController

  def create
    if some_condition?
      redirect_to :root
      flash[:alert] = 'You cannot reset your password, buddy.'
    else
      super
    end
  end

然后,在routes.rb中:

devise_for :users, controllers: { passwords: 'devise/extends/passwords' }

这会将您的应用程序定向到扩展控制器,然后在不满足条件的情况下点击设计控制器(“超级”)。

答案 3 :(得分:0)

凯勒·马丁(Keller Martin)的

Snippet above效果很好!

我遇到的一些小问题如下:

  1. 如果您有uninitialized constant Devise::Extends (NameError)(可能是由于旧的ruby版本造成的?),则可以使用嵌套模块定义。
  2. 如果您需要允许对未经身份验证的用户执行某些操作,则可以跳过过滤器。

下面是更新的代码段。

module Devise
  module Extends
    class PasswordsController < Devise::PasswordsController

      skip_before_filter :authenticate_user!, :only => [ :edit ]

      def edit
        redirect_to "https://www.google.com/"
      end

    end
  end
end