Как пропустить проверку has_secure_password - программирование
Подтвердить что ты не робот

Как пропустить проверку has_secure_password

В моем приложении только администраторы могут создавать новые записи пользователя. Пользователь отправляет по электронной почте ссылку активации, в которой они устанавливают свой пароль.

Я хотел бы использовать метод has_secure_passord (railscast):

class User < ActiveRecord::Base
  has_secure_password
  ...
end

Отлично работает, но он автоматически проверяет наличие дайджеста паролей... поэтому, когда администратор создает запись, проверки не выполняются. У меня есть способ пропустить только автоматически добавленную пароли password_digest, не пропуская остальные, которые я добавил?

4b9b3361

Ответ 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