4

我试图在设计邮件发送的确认页面中显示用户密码。确认页面是默认的

Welcome test0@test.com!

You can confirm your account email through the link below:

Confirm my account

然而,我希望拥有

Welcome test0@test.com!

Your password is currently DASADSADS

You can confirm your account email through the link below:

Confirm my account

如何访问视图中的用户对象?我是否需要用自定义的邮件控制器覆盖邮件控制器?如果是这样,我如何判断当前邮件程序的方法(尝试查看文档但找不到任何线索)?

我注意到视图中使用了@email 和@resource。我可以使用其中任何一个来访问未散列形式的当前密码吗?

请注意,我正在手动发送此电子邮件user.find(1).send_confirmation_instructions

4

3 回答 3

6

尽管可以这样做,但我强烈警告不要这样做。散列密码是专门使用的,因此密码不能轻易重新创建。将原始密码传回给用户将导致它以纯文本形式发回,这有点违背了整个目的。此外,用户不应该已经知道他们的密码(毕竟他们确实输入了两次)?!?

为此,您需要在注册create操作中捕获原始(未散列的)密码并在该点发送电子邮件(传递密码)。您可以通过覆盖该sign_up方法来做到这一点 - 您可以在初始化程序中做到这一点:

class Devise::RegistrationsController < DeviseController
  def sign_up(resource_name, resource)
    sign_in(resource_name, resource)
    resource.unhashed_password = resource_params[:password]
    resource.send_confirmation_instructions
  end
end

或者,您可以从中派生一个新控制器Devise::RegistrationsController并将此覆盖代码放在那里(推荐的方法 - 但同样,这整个操作并不是真正推荐的)。您需要添加unhashed_password访问器才能使其工作:

class User < ActiveRecord::Base
  attr_accessor :unhashed_password
end

然后您可以更新您的确认视图 (at app/views/devise/mailer/confirmation_instructions.html.erb) 以包含以下内容:

<p>Your password is currently <%= @resource.unhashed_password %></p>
于 2013-04-03T18:54:12.837 回答
1

以加密形式设计保存密码:您可以使用以下方法对其进行解密,

生成新的迁移:

$ rails g migration AddLegacyPasswordToUser legacy_password:boolean
      invoke  active_record
      create    db/migrate/20120508083355_add_legacy_password_to_users.rb
$ rake db:migrate

在以下代码中使用 legacy_password 方法可以解密您的密码:

class User < ActiveRecord::Base

...

  def valid_password?(password)
    if self.legacy_password?
      # Use Devise's secure_compare to avoid timing attacks
      if Devise.secure_compare(self.encrypted_password, User.legacy_password(password))

        self.password = password
        self.password_confirmation = password
        self.legacy_password = false
        self.save!

      else
        return false
      end
    end

    super(password)
  end

  # Put your legacy password hashing method here
  def self.legacy_password(password)
    return Digest::MD5.hexdigest("#{password}-salty-herring");
  end
end
于 2013-04-03T18:53:42.530 回答
0

您可以只使用 request.request_parameters[:user][:password] 来获取创建或更新操作的纯文本密码。

于 2013-10-18T06:36:01.797 回答