Пользовательское восстановление пароля Devise

Я имею дело с моделью Devise User с необязательным атрибутом электронной почты (он может войти в систему с номером документа или электронной почтой). Поскольку администраторы могут регистрировать новых пользователей (устанавливая свой пароль), я хотел бы знать, есть ли способ, которым пользователи могут восстановить свой пароль устройства, используя номер документа и дату рождения, чтобы затем зарегистрировать новый пароль.

Надеюсь, это было ясно. Спасибо.


person Oswaldo Ferreira    schedule 30.12.2013    source источник


Ответы (2)


Ну, если человек вошел в систему, вы можете просто вызвать соответствующий метод в этой модели (для пользователя), чтобы восстановить пароль. Я предполагаю, что вам нужно создать представление, которое затем проверяет запрос на сброс пароля на основе этих значений в контроллере, а затем вызывает правильный метод на основе current_user. Я предполагаю, что вам нужен метод send_reset_password_instructions из этого файла.

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

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

РЕДАКТИРОВАТЬ: Эта ссылка также может быть полезной.

person Alex Lynham    schedule 31.12.2013

Мое решение было основано на ответе @Alex. Я сделал пользовательский вид сброса пароля.

При работе с требованием пароля на модели устройства есть два (или более) варианта:

Во-первых, мы можем переопределить метод требования пароля разработки. Это сохранит объект модели без пароля:

def email_required?
  false
end

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

if athlete.new_record?
  generated_password = Devise.friendly_token[0,20]
  athlete.password = generated_password
  athlete.password_confirmation = generated_password
  athlete.skip_confirmation!
end

При желании поместите приведенное выше поведение в модель:

  def reset_password!(new_password, new_password_confirmation)
    self.password = new_password
    self.password_confirmation = new_password_confirmation
    save
  end

Вкратце, это было решение, включая представление с днем ​​​​рождения, паролем и подтверждением пароля, проверку данных на контроллере и переопределение пароля.

person Oswaldo Ferreira    schedule 28.01.2014