17

我正在学习 Michael Hartl 的 Rails 教程,我已经到了您只需添加以下内容的地步:

has_secure_password

到你的模型课上,就会发生一堆魔法。

我了解此方法来自我的模型类扩展ActiveModel::SecurePassword的 中包含的模块。ActiveRecord::Base

我不明白的是,当我将这一行添加到我的类定义中时发生了什么。有人可以尽可能详细地解释一下。我真的很想了解发生了什么,而不仅仅是在我的应用程序上扔东西而不知道它是如何工作的。

(如果有助于理解我为什么感到困惑,我来自 Java 背景,而且我是 Ruby 新手)

4

1 回答 1

16

了解任何事情的最简单方法是查阅源代码!在这种情况下,这将是ActiveModel::SecurePassword 文档。从那里,你可以看到这样has_secure_password做:

def has_secure_password
  # Load bcrypt-ruby only when has_secure_password is used.
  # This is to avoid ActiveModel (and by extension the entire framework) being dependent on a binary library.
  gem 'bcrypt-ruby', '~> 3.0.0'
  require 'bcrypt'

  attr_reader :password

  validates_confirmation_of :password
  validates_presence_of     :password_digest

  include InstanceMethodsOnActivation

  if respond_to?(:attributes_protected_by_default)
    def self.attributes_protected_by_default
      super + ['password_digest']
    end
  end
end

用英文解释,这个函数:

  1. 加载bcrypt-rubyGem 并需要bcrypt. bcrypt是一种安全的散列函数,您可以在 Wikipedia 中了解更多信息。
  2. 向模型添加一个名为 的只读属性password
  3. 验证密码是否由另一个字段确认,称为password_confirmation. 换句话说,您必须输入两次密码才能确认。
  4. 确保在保存模型之前存在 password_digest。
  5. 加载实例方法,在这种情况下是authenticate(如果密码正确则返回 true,否则返回 false)和password=,它将传递的密码加密到 password_digest 属性中。
  6. 如果该方法具有默认受保护的属性,这也将添加password_digest到该受保护属性列表中。(从而防止它被大量分配。)

您可以在ActiveModel::SecurePassword 文档有关其实例属性的进一步文档中了解更多信息。

于 2013-03-20T03:53:02.607 回答