Отключить проверку пароля password_confirmation has_secure_password в Rails 4

Я создаю базовый проект Ruby on Rails 4, который позволяет пользователю создавать учетные записи, логин и т.д. Я использую встроенный has_secure_password для управления паролем. Я не хочу, чтобы пользователям приходилось вводить свой пароль дважды (т.е. password_confirmation поле формы ввода пароля_подтверждения и соответствующий атрибут модели). Итак, я ищу способ отключить password_confirmation check/required.

Я нашел этот ответ, который дает потенциальное решение, но исходный вопрос достаточно разный, и я хочу проверить его отдельно. Он рекомендует обновить модель пользователя, чтобы добавить следующее:

class User < ActiveRecord::Base

 # ...

 has_secure_password validations: false
 validates :password, presence: true, length: { minimum: 6 }

end

Это, похоже, работает и позволяет проходить тесты RSpec. Мой вопрос состоит в следующем:

  1. Существуют ли какие-либо негативные последствия или проблемы безопасности при таком подходе?
  2. Существуют ли альтернативные способы отключить подтверждение password_confirmation которое является более безопасным или более встроенным с "The Ruby Way"?
2 ответа

ActiveModel :: SecurePassword имеет параметр, для которого вы можете указать не выполнять проверки.

has_secure_password validations: false

Затем просто убедитесь, что вы выполняете проверку в своем поле пароля вручную.

validates_presence_of :password, on: :create

Необязательно, что еще одна недостающая вещь заключается в том, чтобы поднять ошибку, если пароль_digest как-то пуст. Я не знаю, как это могло произойти.

before_create { raise "Password digest missing on new record" if password_digest.blank? }

Мне кажется, это решает проблему как можно чище.


Если вы посмотрите на ActiveModel :: SecurePassword, вы увидите проверки, созданные has_secure_password.

if options.fetch(:validations, true)
 validates_confirmation_of :password, if: :should_confirm_password?
 validates_presence_of :password, on: :create
 validates_presence_of :password_confirmation, if: :should_confirm_password?

 before_create { raise "Password digest missing on new record" if password_digest.blank? }
end

отключив проверки, вы также предотвращаете проверку поля :password_digest, что не является огромной сделкой, но все же не идеальной.

Я думаю, что лучший вариант - переопределить метод по умолчанию, should_confirm_password?

# If password_confirmation is passed, business as usual.
# If not, don't run the validations
def should_confirm_password?
 password_confirmation.present? || false
end

licensed under cc by-sa 3.0 with attribution.