4

在 Rails 中设计身份验证 gem。

如何防止“忘记密码”链接更改密码后自动登录?

理想情况下,最好显示带有“新密码已保存”消息的页面。

4

4 回答 4

4

您将需要覆盖 Devise ,您可以在此处passwords_controller查看默认方法。首先,创建您自己的控制器,该控制器将从 Devise 控制器继承:

class User::PasswordsController < Devise::PasswordsController

准备好控制器后,添加您不想覆盖的所有其他方法,然后在其中简单地调用 super 。这将是neweditcreate方法。也不要忘记添加受保护的after_sending_reset_password_instructions_path_for(resource_name)方法。

您关心的覆盖方法是update操作。

def update
  self.resource = resource_class.reset_password_by_token(resource_params)

  if resource.errors.empty?
    flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
    set_flash_message(:notice, "Your flash message here")
    redirect_to new_user_session_path
  else
    respond_with resource
  end
end

我们在这里所做的更改是删除通过重定向到登录页面登录用户的行,然后设置我们的自定义 Flash 消息。

最后,您必须告诉 devise 使用您的新控制器,因此routes.rb更改devise_for :users为:

devise_for :users, :controllers => { :passwords => 'users/passwords' }

那应该这样做。

于 2012-05-19T01:15:55.863 回答
2

这是基于设计 3.1.1 的更新

class Users::PasswordsController < Devise::PasswordsController

 def new
   super
 end

 def edit
   super
 end

 def create
   super
 end

 #override this so user isn't signed in after resetting password
 def update
    self.resource = resource_class.reset_password_by_token(resource_params)

    if resource.errors.empty?
      resource.unlock_access! if unlockable?(resource)
      flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
      set_flash_message(:notice, flash_message) if is_navigational_format?

      respond_with resource, :location => after_resetting_password_path_for(resource)
    else
      respond_with resource
    end

  end

protected

   def after_resetting_password_path_for(resource)
     new_session_path(resource)
   end

结尾

于 2013-10-22T16:53:20.817 回答
2

从 Devise 3.5.0开始,可以使用设置来控制此行为,该设置位于config/initializers/devise.rb

# When set to false, does not sign a user in automatically after their password is
# reset. Defaults to true, so a user is signed in automatically after a reset.
config.sign_in_after_reset_password = false

显示的闪烁消息将为Your password has been changed successfully.,但可以在 中调整config/locales/devise.en.yml

en:
  devise:
    passwords:
      updated_not_active: New password has been saved
于 2019-01-10T12:26:41.113 回答
0

上面说的答案是正确的,但问题是它根据设计版本而有所不同。我按照上面所说的,我无法让它工作,一段时间后我发现我使用的设计版本不支持 resource_params 方法,然后我尝试了不同的版本并让它工作。

于 2012-11-22T05:05:07.587 回答