module ActiveRecord::SecurePassword::ClassMethods
Публичные методы экземпляра
# File activerecord/lib/active_record/secure_password.rb, line 41
def authenticate_by(attributes)
passwords, identifiers = attributes.to_h.partition do |name, value|
!has_attribute?(name) && has_attribute?("#{name}_digest")
end.map(&:to_h)
raise ArgumentError, "One or more password arguments are required" if passwords.empty?
raise ArgumentError, "One or more finder arguments are required" if identifiers.empty?
return if passwords.any? { |name, value| value.nil? || value.empty? }
if record = find_by(identifiers)
record if passwords.count { |name, value| record.public_send(:"authenticate_#{name}", value) } == passwords.size
else
new(passwords)
nil
end
end По заданному набору атрибутов находит запись, используя атрибуты, не относящиеся к паролю, а затем аутентифицирует эту запись с помощью атрибутов пароля. Возвращает запись, если аутентификация прошла успешно; в противном случае возвращает nil.
Независимо от того, найдена ли запись, authenticate_by выполнит криптографическое хеширование заданных атрибутов пароля. Такое поведение помогает предотвращать атаки перебора, основанные на времени выполнения, при которых злоумышленник может определить, существует ли запись с паролем, даже не зная сам пароль.
Вызывает ArgumentError, если набор атрибутов не содержит как минимум одного атрибута пароля и одного атрибута, не относящегося к паролю.
Примеры
class User < ActiveRecord::Base has_secure_password end User.create(name: "John Doe", email: "jdoe@example.com", password: "abc123") User.authenticate_by(email: "jdoe@example.com", password: "abc123").name # => "John Doe" (in 373.4ms) User.authenticate_by(email: "jdoe@example.com", password: "wrong") # => nil (in 373.9ms) User.authenticate_by(email: "wrong@example.com", password: "abc123") # => nil (in 373.6ms) User.authenticate_by(email: "jdoe@example.com", password: nil) # => nil (no queries executed) User.authenticate_by(email: "jdoe@example.com", password: "") # => nil (no queries executed) User.authenticate_by(email: "jdoe@example.com") # => ArgumentError User.authenticate_by(password: "abc123") # => ArgumentError
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.