Ruby on Rails / Devise - Требование пароля при смене адреса электронной почты

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

В любом случае, Я использую Ruby on Rails 3 с Devise для аутентификации пользователя. Как вы, возможно, знаете, в пользовательском admin / edit по умолчанию пользователь должен ввести свой текущий пароль в поле current_password, если он предоставит новый пароль. Существует ТОННА информации о том, как отключить current_password, чтобы пользователи могли свободно изменять и сохранять.

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

После просмотра вики-страницы Devise я нашел эту страницу и подумал, что я может отменить этот код, чтобы завершить это решение. Мне удалось немного поработать с этим в моей модели user.rb (я исключил ненужную логику для этого поста) ....

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable and :timeoutable
  devise :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :name, :email, :password, :password_confirmation, :avatar, :remember_me, :agree
  attr_accessor :accessible, :agree, :signed_in
  attr_readonly :name

  # Validation
  validates :name, :presence => TRUE, :uniqueness => TRUE, :length => { :within => 4..20 }
  validates :agree, :term_agreement => TRUE, :unless => :signed_in
  validates_attachment_size :avatar, :less_than => 1.megabyte
  validates_attachment_content_type :avatar, :content_type => ['image/jpeg', 'image/png', 'image/gif']
  validates :current_password, :presence => TRUE, :if => :password_required?

  protected

  def password_required?
    email_changed?
  end

end

Это «почти» работает. Если я сохраню профиль пользователя, ничего не меняя, или изменю другое поле, не требующее пароля (например, аватар пользователя), профиль сохранится нормально, пароль не потребуется. Пока все хорошо.

И если я изменю адрес электронной почты, сработает проверка .... но происходит то, что оба поля current_password И пароль (для нового пароля) запускаются по мере необходимости. . И если я введу пароль во все три (password, password_confirmation, current_password) просто так, этого не будет, просто снова выдаст ошибку проверки.

По сути, ТОЛЬКО current_password должен потребоваться, если адрес электронной почты изменен.

Как мне решить эту проблему? Пожалуйста, помогите.

69
задан Ajsar Muhammed rafeeque 14 July 2015 в 13:21
поделиться