Проверка по пустому паролю в Rails - PullRequest
0 голосов
/ 22 марта 2019

Я добавил проверки пароля к моей модели User:

validates :password, presence: true
validates :password, confirmation: { case_sensitive: true }

, но затем, когда я захотел обновить другие поля на users, эти проверки сделали транзакцию недействительной, как passwordотсутствовал.

В результате небольшого исследования я понял, что могу пропустить эти проверки, если password не присутствует:

validates :password, presence: true, if: :validate_password?
validates :password, confirmation: { case_sensitive: true }, if: :validate_password?


def validate_password?
  password.present? || password_confirmation.present?
end

Однако теперь, когда я отправляю пробелпароль и подтверждение пароля, validate_password? возвращает false.Я не совсем понимаю, что происходит, потому что

@user.update_attributes(password_reset_edit_params) возвращает true

, где

password_reset_edit_params равно <ActionController::Parameters {"password"=>"", "password_confirmation"=>""} permitted: true>

, новнутри

def validate_password?
  password.present? || password_confirmation.present?
end

password и password_confirmation оценивается как nil, а мой @user пароль не обновляется до пустой строки.

Я должен упомянуть, что я 'м, используя Bcrypt, и @user.password фактически всегда будет оцениваться как nil, тогда как password_digest доступно.

Так, каково решение?В конечном счете, я думаю, что мой вопрос прост:

Как можно игнорировать проверки пароля, когда я не пытаюсь предоставить пароль, но также разрешать эти проверки при отправке пустой строки?

Это происходитдля меня, что я мог бы добавить в контроллер условие, которое не позволяет передавать пустые строки, но должен быть аккуратный способ решить эту проблему.

Любая помощь очень ценится.Спасибо!

Ответы [ 3 ]

1 голос
/ 22 марта 2019

Если вы используете Bcrypt и дайджест, вы можете использовать в вашей модели, например,

has_secure_password
validates :password, length: { minimum: 8 }, allow_blank: true

В этом случае проверка будет работать только для установки и изменения пароля.

Если вы неДля изменения пароля вам не нужно вводить пароль.

Другой способ

validates :password, presence: true, on: :create
1 голос
/ 22 марта 2019

В Rails вы не проверяете параметр, вы проверяете модель.

Не «пропускать проверку, если пароль отсутствует». Это цель проверки. Валидация предназначена для проверки модели , а не параметров. Если модель имеет пустой пароль и требуется наличие пароля, это недопустимая модель. Всегда.

но затем, когда я захотел обновить другие поля для пользователей, эти проверки делали транзакцию недействительной, поскольку пароль отсутствовал.

Это не потому, что пароль отсутствует, а потому, что в экземпляре пользователя нет пароля. Это должно работать так:

  1. Пользователь создан с паролем и проверен: User.create(name: "Me", password: "something that isn't nil")
  2. Пользователь обновлен: User.update(name: "New name") # password is inside the model still so it is still valid

Вот как это работает. Если вы хотите, чтобы пользователь мог иметь нулевой / пустой пароль, вам не следует пытаться поместить проверку присутствия в модель.

0 голосов
/ 22 марта 2019

В конечном итоге я просто проверяю форматирование пароля и подтверждение на модели User:

validates :password,  confirmation: true,
                      length: {within: 6..40},
                      allow_blank: true

и очищаю входные данные от пустого подтверждения пароля / пароля в контроллере.

if password_reset_edit_params[:password].blank? || password_reset_edit_params[:password_confirmation].blank?
      @user.errors[:password] << "can't be blank" if password_reset_edit_params[:password].blank?
      @user.errors[:password_confirmation] << "can't be blank" if password_reset_edit_params[:password_confirmation].blank?
      render 'edit'
...