Проверка пароля в Ruby on Rails - PullRequest
14 голосов
/ 26 февраля 2011

Итак, у меня есть интересные требования для проверки пароля:

  • Когда пользователь регистрируется, я хочу, чтобы он ввел пароль и подтвердил, и будет между 6..40 (ПОЛУЧИЛ ЭТО РАБОТАЮ 100%)

  • Когда пользователь обновляет свой профиль, применяются те же правила проверки (ПОЛУЧИЛ ЭТУ РАБОТУ 100%)

  • Когда администратор добавляет пользователя, он должен ввести пароль только один раз, и он должен быть подтвержден (НЕ РАБОТАЕТ)

  • Когда администратор редактирует пользователя и поле пароля не заполнено, он не должен обновлять пароль, если он что-то вводит, он должен быть проверен. (ЧАСТИЧНАЯ РАБОТА)

    validates :password, :presence => true,
                       :confirmation => true,
                       :length => {:within => 6..40},
                       :unless => :force_submit
    

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

:force_submit передается из формы администратора, поэтому пароль не проверен. (Так работает случай обновления пустого пароля)

Есть идеи / магия?

Ответы [ 4 ]

29 голосов
/ 26 февраля 2011

Кажется, что ниже приведены мои требования ... Сейчас мне нужно подтверждение для всех пользователей .. (Это делает просмотр чище). Но при обновлении я разрешаю пропуски.

  validates :password, :presence => true,
                       :confirmation => true,
                       :length => {:within => 6..40},
                       :on => :create
  validates :password, :confirmation => true,
                       :length => {:within => 6..40},
                       :allow_blank => true,
                       :on => :update
27 голосов
/ 10 ноября 2015

Опираясь на принятый ответ, вот код, который я использовал в проекте Rails на работе. (Примечание. Мы используем devise для обработки аутентификации пользователей и devise_invitable для создания новых пользователей.)

PASSWORD_FORMAT = /\A
  (?=.{8,})          # Must contain 8 or more characters
  (?=.*\d)           # Must contain a digit
  (?=.*[a-z])        # Must contain a lower case character
  (?=.*[A-Z])        # Must contain an upper case character
  (?=.*[[:^alnum:]]) # Must contain a symbol
/x

validates :password, 
  presence: true, 
  length: { in: Devise.password_length }, 
  format: { with: PASSWORD_FORMAT }, 
  confirmation: true, 
  on: :create 

validates :password, 
  allow_nil: true, 
  length: { in: Devise.password_length }, 
  format: { with: PASSWORD_FORMAT }, 
  confirmation: true, 
  on: :update
0 голосов
/ 22 сентября 2014

еще один вариант

validates_presence_of :password_digest

validates_length_of :password, minimum: 6, if: Proc.new { |user| user.password.present? }
0 голосов
/ 08 марта 2014

это работает для пустого пароля при обновлении:

validates :password, :presence => true, :on => :update,
 :if => lambda{ !password.nil? }

validates :password,
  :confirmation => true,
  :length => { :minimum => 6},
  :if => lambda{ new_record? || !password.nil? }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...