2013-11-14 7 views
2

Я использую драгоценный камень. Придумайте отправку сбросного пароля в почтовом ящике, когда пользователь нажимает ссылку на забыть пароль. Пользователь перейдет по ссылке и сбросит пароль, введя новый пароль и подтвердя новый пароль.Rails devise сбросить токен доступа не получается

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

Теперь я хочу сбросить токен сброса, как только он будет использован. Так что, когда вы следуете ранее используемой отправке ссылки со старой почты, он должен получить сообщение о том, что «Недопустимый токен»

Как это сделать?

Заранее спасибо.

+0

Какую версию Rails и devise вы используете? –

+0

Rails 3.2.13 Devise 3.1.0 –

ответ

-1

Я достиг выше, переопределив Devise :: PasswordsController в приложении.

Devise handle сбросить пароль на PasswordController # изменить действие.

При редактировании я проверил, действительно ли маркер пароля сброса действителен или нет. Если он действителен, я разрешаю пользователю сбрасывать пароль, иначе перенаправит пользователя для входа на страницу с «Недопустимым сообщением пароля».

Для DEViSE 3.0

class Users::PasswordsController < Devise::PasswordsController 
    def edit 
    self.resource = resource_class.find_or_initialize_with_error_by(:reset_password_token,  params[:reset_password_token]) 
    if !resource.errors.empty? 
     flash[:alert] = "Password token is invalid" 
     redirect_to new_session_path(resource_name) 
    end 
    end 
end 

Для DEViSE 3,1

class Users::PasswordsController < Devise::PasswordsController 
    def edit 
    original_token  = params[:reset_password_token] 
    reset_password_token = Devise.token_generator.digest(self, :reset_password_token, original_token) 
    self.resource = resource_class.find_or_initialize_with_error_by(:reset_password_token, reset_password_token) 
    if !resource.errors.empty? 
     flash[:alert] = "Password token is invalid" 
     redirect_to new_session_path(resource_name) 
    end 
    end 
end 
+0

вы можете переопределить этот метод 'after_password_reset' для выполнения этой операции на вашей модели. Для этого вам не нужно создавать контроллер. – Rubyrider

0

Вы можете попробовать любой из следующих методов

# reset_password_within = 1.day and reset_password_sent_at = today 
reset_password_period_valid? # returns true 

# reset_password_within = 5.days and reset_password_sent_at = 4.days.ago 
reset_password_period_valid? # returns true 

# reset_password_within = 5.days and reset_password_sent_at = 5.days.ago 
reset_password_period_valid? # returns false 

# reset_password_within = 0.days 
reset_password_period_valid? # will always return false 

или вы можете вызвать методы экземпляра, как ясный пароль сброса маркера или по телефону clear_reset_password_token или after_password_reset методы.

+1

Как и где я могу использовать reset_password_period_valid?метод для отображения сообщения «Токен недействителен», и если токен действителен, пользователь будет продолжать вводить новый пароль. Сможете ли вы дать четкое представление об этом. Нужно ли переопределять пароль? –

2

легче и безопаснее решение, чем то, что было предложено:

Создать свой собственный контроллер паролей, я решил поместить его под контроллеры/auth

контроллеры/a UTH/passwords_controller.rb

class Auth::PasswordsController < Devise::PasswordsController 

    def update 
    super do |resource| 
     if resource.reset_password_token_changed? and resource.reset_password_token_was.nil? 
     resource.reset_password_token = nil 
     end 
    end 
    end 

end 

Это исправить многие проблемы с papertrail, например, и в любом случае сохранить один доступ к БД

0

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

class YourModel < ActiveRecord::Base 
    ... 
    def after_password_reset 
      self.clear_reset_password_token if not (self.reset_password_token.nil? and self.reset_password_sent_at.nil?) 
    end 
end 

Предлагаю не использовать контроллер для выполнения бизнес-операций. Этот пароль after_password_reset используется для вызова после маркера clear_reset_password. Вот эта ссылка: https://github.com/plataformatec/devise/blob/master/lib/devise/models/recoverable.rb#L39

Надеюсь, это поможет.

Смежные вопросы