2017-01-30 7 views
1

[ETA обновляется в конце с моим текущим решением]пользователя Force сбросить пароль при первом входе с Devise

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

Моего текущее усилие, чтобы перезаписать метод #after_confirmation_path_for в DEViSE ConfirmationsController так, что она включает в себя этот фрагмент:

if resource.sign_in_count == 1 
    resource.send(:set_reset_password_token) 
    edit_password_path(resource, reset_password_token: @token) 
else 
    # etc 
end 

Но когда он идет по пути, он перенаправляет от смены пароля, казалось бы, из-за эта линия в DEViSE :: PasswordsController:

# Render the #edit only if coming from a reset password email link 
append_before_filter :assert_reset_token_passed, only: :edit 

Так что я мог перезаписать этот вызов, но я настороженно о том, почему он был там в первую очередь, и является ли это может вызвать другие проблемы - даже если нет, то это чувствует, что я d довольно много взлома, чтобы включить сценарий, который, как я мог бы себе представить, относительно распространен. Есть ли еще способ Devise-y подойти к этому?

ETA: Я сделал это успешно пропустить фильтры со следующим кодом:

class PasswordsController < Devise::PasswordsController 
    skip_before_filter :require_no_authentication, 
        :assert_reset_token_passed, 
        only: :edit 
end 

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

Может ли кто-нибудь консультировать, нормально ли использовать этот подход или есть более безопасная альтернатива?

+0

Посмотрите [здесь] (http://stackoverflow.com/a/29416605/1520965), кажется, ответ на ваш вопрос –

+0

Мы хотим послать их на экран сброса пароля Devise, а не направлять их на полное редактирование профиля. – Arepo

ответ

1

На вашем контроллере приложений переопределите метод «after_sign_in_path». использовать sign_in_count, чтобы проверить, если это первый Логин:

def after_sign_in_path_for(resource) 
if current_user.sign_in_count == 1 
    edit_passwords_path 
else 
    root_path 
end 
end 
+0

Я успешно направляю их в путь edit_password_path, но проблема в том, что они сразу перенаправляются, потому что (я думаю) из строки 'append_before_filter: assert_reset_token_passed, only:: edit'. Я думаю, что я могу взломать Devise, чтобы не перенаправлять (хотя я еще не делал эту работу, поэтому, возможно, я говорю слишком рано), но похоже, что я бы предпочел, чтобы у Devise было более готовое решение для. – Arepo