3

我正在寻找设计中的自定义项,如果我们单击忘记密码,它应该将邮件发送到任何电子邮件 ID。无论电子邮件 ID 是否存在,Gmail 中都会发生类似的事情。

屏幕一 在此处输入图像描述

屏幕 2 在此处输入图像描述

目前我所拥有的是它尝试与系统中的有效用户进行验证。

在此处输入图像描述

设计可恢复模块负责这个

       def send_reset_password_instructions(attributes={})
          recoverable = find_or_initialize_with_errors(reset_password_keys, attributes,   :not_found)
          recoverable.send_reset_password_instructions if recoverable.persisted?
          recoverable
        end

如何删除此验证并将电子邮件发送到任何电子邮件 ID?

4

2 回答 2

15

有一个称为设计的配置paranoid,当设置为 true 时,会以某种方式更改消息以避免电子邮件枚举。只需config.paranoid = true在您的设计配置中进行设置。

于 2014-06-07T16:21:19.847 回答
2

我的解决方案是扩展/覆盖 Devise 的密码控制器。为此,创建一个从 Devise 的密码控制器继承的控制器(我们称之为密码),如下所示:

class PasswordsController < Devise::PasswordsController

然后编辑您的路线文件,使此更改生效:

devise_for :users, :controllers => { :passwords => 'passwords' }

现在,您将要覆盖createaction。有几种方法可以做到这一点,但由于我不确定你想做什么,我将向你展示你可以做的 2 件事:

  1. 您只想防止“找不到电子邮件”错误,以便人们无法找到您的数据库中存在或不存在哪些电子邮件:

    def create
      self.resource = resource_class.send_reset_password_instructions(resource_params)
    
      respond_with({}, :location => after_sending_reset_password_instructions_path_for(resource_name))
    end
    
  2. 您真的想向任何输入的电子邮件发送电子邮件:

    def create
      self.resource = resource_class.send_reset_password_instructions(resource_params)
    
      unless successfully_sent?(resource)
        Devise::Mailer.reset_password_instructions(resource).deliver
      end
    
      respond_with({}, :location => after_sending_reset_password_instructions_path_for(resource_name))
    end
    

现在,最后一个解决方案的问题是您正在向不存在的用户发送电子邮件......所以当用户回来时,他将无法输入他的新密码,因为他的用户帐户可以找不到。但如果你真的想这样做,希望我能让你走上正确的轨道。

于 2012-11-10T15:27:37.433 回答