Как пропустить проверку has_secure_password
В моем приложении только администраторы могут создавать новые записи пользователя. Пользователь отправляет по электронной почте ссылку активации, в которой они устанавливают свой пароль.
Я хотел бы использовать метод has_secure_passord (railscast):
class User < ActiveRecord::Base
has_secure_password
...
end
Отлично работает, но он автоматически проверяет наличие дайджеста паролей... поэтому, когда администратор создает запись, проверки не выполняются. У меня есть способ пропустить только автоматически добавленную пароли password_digest, не пропуская остальные, которые я добавил?
Ответы
Ответ 1
Я решил сделать свою собственную аутентификацию. Следующее решение будет проверять пароли, но только при их установке. Это позволяет администраторам создавать пользователей без добавления пароля.
class User < ActiveRecord::Base
include BCrypt
attr_accessor :password, :password_confirmation
validates :password, length: (6..32), confirmation: true, if: :setting_password?
def password=(password)
@password = password
self.password_hash = Password.create(password)
end
def authenticate(password)
password.present? && password_hash.present? && Password.new(password_hash) == password
end
private
def setting_password?
password || password_confirmation
end
end
Если кто-то отправляет ответ, который позволяет мне использовать метод has_secure_password
, я соглашусь с ним.
Ответ 2
Так как версии 4.X рельсов, has_secure_password
принимает опцию: валидации. Если вы установите его на false
, он не будет запускать проверки.
Версия 3.X этого драгоценного камня не поддерживает этот параметр. Однако вы можете заархивировать activemodel/lib/active_model/secure_password.rb из последнего 4.0.XRC кода, который поддерживает этот аргумент.
Таким образом, ваш код будет выглядеть так:
class User < ActiveRecord::Base
has_secure_password :validations => false
...
end
Ответ 3
Нет возможности пропустить проверку, но было бы достаточно просто написать собственную версию метода, которая позволяет передать аргумент, чтобы определить, следует ли проверять наличие поля password_digest.
Просто добавьте ActiveModel
так же, как в модуль SecurePassword (через ActiveSupport::Concern
) и добавьте свой собственный метод безопасного пароля.
то есть.
module ActiveModel
module MySecurePassword
extend ActiveSupport::Concern
module ClassMethods
def my_has_secure_password(validate_password_digest=true)
# you custom logic
end
end
end
end