has_secure_password如何在我的模型类中工作?

Chr*_*rry 12 ruby ruby-on-rails ruby-on-rails-3

我正在做Michael HartlRails教程,我已经到了你只需添加:

has_secure_password
Run Code Online (Sandbox Code Playgroud)

你的模特课和一堆魔术发生了.

我知道这个方法来自我的模型类扩展的ActiveModel::SecurePassword模块ActiveRecord::Base.

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

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

Ver*_*cus 9

了解任何事情的最简单方法是咨询来源!在这种情况下,那将是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
Run Code Online (Sandbox Code Playgroud)

用英语解释,这个功能:

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

您可以在ActiveModel :: SecurePassword文档以及有关其实例属性更多文档中了解更多信息.