Rails 设计临时密码

问题描述 投票:0回答:1

有什么简单的方法可以让设备密码成为临时密码吗?

我想做这样的事情:

User.first.update(password: 'qwerty', lifetime: 1.hour) 

我想为特定用户设置临时密码

我的意思是宝石或例子之类的东西

什么也没尝试,寻找完成的解决方案

ruby-on-rails ruby security devise ruby-on-rails-5
1个回答
0
投票

Devise 没有内置功能可以执行此操作,因此您需要使用自己的解决方案。 基本方法可能如下所示:

  1. 添加密码过期列: 您需要向用户表添加一个新列来跟踪密码的过期时间,即用户表中的一个字段

    password_expires_at:datetime

  2. 扩展用户模式: 接下来,您需要修改用户模型来处理密码过期逻辑,并在密码更新时设置过期字段

class User < ApplicationRecord
  devise ... blah blah

  before_save :set_password_expiration

  def set_password_expiration
    self.password_expires_at = Time.current + 1.hour if self.encrypted_password_changed?
  end

  def password_expired?
    self.password_expires_at && Time.current > self.password_expires_at
  end
end
  1. 修改认证逻辑: 接下来,您需要重写用户模型中的
    active_for_authentication?
    方法以包含密码过期检查。 又是这样的
def active_for_authentication?
  super && !password_expired?
end

您现在应该能够执行以下操作:

User.first.update(password: 'qwerty', password_expires_at: Time.current + 1.hour)

这只是帮助您入门的基本实现。您需要处理过期的密码等。因此,为此您可以将它们重定向到密码重置页面(通常您可以通过向 Devise SessionsController 添加一些自定义逻辑来完成此操作)

© www.soinside.com 2019 - 2024. All rights reserved.