了解任何事情的最简单方法是查阅源代码!在这种情况下,这将是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
用英文解释,这个函数:
- 加载
bcrypt-ruby
Gem 并需要bcrypt
. bcrypt是一种安全的散列函数,您可以在 Wikipedia 中了解更多信息。
- 向模型添加一个名为 的只读属性
password
。
- 验证密码是否由另一个字段确认,称为
password_confirmation
. 换句话说,您必须输入两次密码才能确认。
- 确保在保存模型之前存在 password_digest。
- 加载实例方法,在这种情况下是
authenticate
(如果密码正确则返回 true,否则返回 false)和password=
,它将传递的密码加密到 password_digest 属性中。
- 如果该方法具有默认受保护的属性,这也将添加
password_digest
到该受保护属性列表中。(从而防止它被大量分配。)
您可以在ActiveModel::SecurePassword 文档和有关其实例属性的进一步文档中了解更多信息。