使用 Ruby on Rails 进行设计 - 强制用户在首次登录时更改密码

2024-05-13

我有一个运行 Devise 的 RoR 应用程序(Rails 4.2、Ruby 2.2.0)。我已经进行了设置,以便管理员用户(标识了我添加到用户模型中的“is_admin”布尔值)能够创建新的用户帐户,为他们提供生成的密码和确认电子邮件。这一切都工作正常。我还添加了日期时间列 pass_changed,当用户更改密码时应更新该列,然后对照 创建的_at 检查以确保自创建帐户以来密码已更改。如果两个日期相同,则用户将被重定向到密码更改表单。

我编写了一个程序来检查用户是否更改了密码并将其放置在我的 application_controller.rb 中:

def check_changed_pass
@user = current_user
    if @user.pass_changed == @user.created_at #make sure user has changed their password before accessing internal pages
    redirect_to edit_user_registration_path, alert: "You must change your password before logging in for the first time"
    end
end

然后在我的internal_controller.rb中(用于所有需要用户登录的内部:

before_action :check_changed_pass

到目前为止一切顺利,但问题在于尝试在正确的时间更新 pass_changed 。我尝试了各种配置,但我找不到放置此代码的位置,以便在更新密码时触发它,但不是每次更新用户模型时触发,其中包括每次登录和注销,当我只想它时如果密码更新则触发。

如果我将“before_save :update_pass_change, only: [:edit, :update]”放在我的控制器中,它不会在密码更新时触发,如果我将它放在用户模型中,我必须将过程放入模型中同样,它也不会选择 current_user,因为它在模型中不可用。理想的情况是,Devise 有一个类似于 after_database_authentication 挂钩的 after_password_edit 挂钩。我必须覆盖 Devise 的 Registrations_controller.rb 才能删除该行

prepend_before_filter :require_no_authentication, only: [ :cancel]

这样管理员用户就可以添加新用户。我尝试将 update_pass_change 放在那里,但它似乎不会在密码编辑时触发 before_save 。

在application_controller.rb中

def update_pass_change # records that the user has changed their password
    unless current_user.pass_changed != current_user.created_at
    current_user.pass_changed = Time.now
    end
end

类似的未回答问题:Ruby on Rails:设计 - 首次登录时更改密码 https://stackoverflow.com/questions/13121356/ruby-on-rails-devise-password-change-on-first-login


您可以在模型上使用回调,并在保存之前检查更改是否包含您的密码属性。像这样的事情:

class User < ActiveRecord::Base
  before_save :check_password_changed

  private
  def check_password_changed
    self.pass_changed = Time.now if changed.include? 'encrypted_password'
  end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Ruby on Rails 进行设计 - 强制用户在首次登录时更改密码 的相关文章

随机推荐