我有一个运行 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