繁体   English   中英

使用update_with_password设计Rails 5安全扩展错误

[英]devise Rails 5 security extension error using update_with_password

似乎有一个类似的问题在这里 ,但没有人能够回答这个问题。 这似乎也有所不同。

我正在从Rails 4.2.4升级到Rails 5.0.0.1。 当我尝试在30天后运行密码到期时,它会通过更新操作(第二行出现问题):

def update
  resource.extend(Devise::Models::DatabaseAuthenticatablePatch)
  if resource.update_with_password(resource_params)
    warden.session(scope)['password_expired'] = false
    set_flash_message :notice, :updated
    sign_in scope, resource, :bypass => true
    redirect_to stored_location_for(scope) || :root
  else
    clean_up_passwords(resource)
    respond_with(resource, action: :show)
  end
end

这是运行的模块:

module Devise
  module Models
    module DatabaseAuthenticatablePatch
      def update_with_password(params, *options)

        new_password = params[:password]
        new_password_confirmation = params[:password_confirmation]

        result = if new_password.present? && new_password_confirmation.present?
                   update_attributes(params, *options)
                 else
                   self.assign_attributes(params, *options)
                   self.valid?
                   self.errors.add(:password, new_password.blank? ? :blank : :invalid)
                   self.errors.add(:password_confirmation, new_password_confirmation.blank? ? :blank : :invalid)
                   false
                 end

        clean_up_passwords
        result
      end
    end
  end
end

当您点击update_attributes(params, *options)时发生错误

然后我得到这个错误。

undefined method `<<' for #<OldPassword::ActiveRecord_AssociationRelation:0x007ffe59a0ffa0>

如果有人可以帮助我解决这个问题,那将是惊人的。

先感谢您。

问题是devise_security_extension gem。 我正在使用password_archivable,在他们的模块中,我需要将old_password对象转换为数组,以便能够将更改的密码添加到表中。

我最终创建了password_archivable.rb并将其放在初始化程序中。

module Devise
  module Models
    # PasswordArchivable
    module PasswordArchivable
      # validate is the password used in the past
      def password_archive_included?
        unless self.class.deny_old_passwords.is_a? Fixnum
          if self.class.deny_old_passwords.is_a? TrueClass and archive_count > 0
            self.class.deny_old_passwords = archive_count
          else
            self.class.deny_old_passwords = 0
          end
        end
        if self.class.deny_old_passwords > 0 and not self.password.nil?
          old_passwords_including_cur_change = self.old_passwords.order(:id).reverse_order.limit(self.class.deny_old_passwords).to_a
          old_passwords_including_cur_change << OldPassword.new(old_password_params)  # include most recent change in list, but don't save it yet!
          old_passwords_including_cur_change.each do |old_password|
            dummy                    = self.class.new
            dummy.encrypted_password = old_password.encrypted_password
            dummy.password_salt      = old_password.password_salt if dummy.respond_to?(:password_salt)
            return true if dummy.valid_password?(self.password)
          end
        end
        false
      end
    end
  end
end

那是唯一的问题。

希望这对其他人有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM