3

我在我的 Rails 3 应用程序中使用 Devise。当前重置密码的行为是点击“忘记密码?” 关联。这里的链接是:

(url)/password/new.user

这将在设计 passwords_controller.rb 中调用以下方法:

def new
    build_resource({})
end

此方法将执行以下操作:

  1. 生成密码重置令牌并将其添加到数据库中,

  2. 使用包含令牌的链接向此人发送电子邮件:

    (url)/密码/编辑?reset_password_token=xxxxxxxxxxxxxxx

有什么方法可以说服 Devise 只执行第 1 步而不执行第 2 步?如果可能的话,是否有任何我应该注意的安全问题,并且我确实采用了这种方法来简化网站的一部分。

4

3 回答 3

6

我建议覆盖send_devise_notification您的 User (?) 模型并在通知值为:reset_password_instructions. 像这样的东西:

# app/models/user.rb
def send_devise_notification(notification)
    return true if notification == :reset_password_instructions
end

检查他们的示例,了解如何覆盖/自定义发送电子邮件的行为 https://github.com/plataformatec/devise/blob/master/lib/devise/models/authenticatable.rb#L127

于 2013-01-31T22:23:40.370 回答
2

您可以在实例级别禁用它:

# disable all notifications
user.define_singleton_method(:send_devise_notification) { |*_| true }

# disable the one you want
user.define_singleton_method(:send_devise_notification) do |*args|
  return true if args[0] == :reset_password_instructions
  super
end
于 2018-01-25T14:43:55.140 回答
1

问题的标题是笼统的,但问题本身更具体。这是截至 2021 年一般问题的答案。

为了防止在更改用户密码时发送密码更改电子邮件通知,请在保存skip_password_change_notification!用户之前调用用户。

user = User.find(123)
user.skip_password_change_notification!
user.password = 'DoNotUse$123'
user.save
于 2021-06-19T14:41:23.367 回答