Rails>设计密码加密

Ste*_*ess 4 ruby-on-rails devise ruby-on-rails-3 ruby-on-rails-3.2

我正在尝试实现一种方法,允许密码从设备外的其他服务更改无论如何.

# Profile password change
def change_password(oldpass, newpass)
    pepper  = nil
    cost    = 10

    # Encrypt plain text passwords
    encrypt_old     = ::BCrypt::Password.create("#{oldpass}#{pepper}", :cost => cost).to_s

    # Validate old
    if self.encrypted_password == encrypt_old
        encrypt_new     = ::BCrypt::Password.create("#{newpass}#{pepper}", :cost => cost).to_s
        self.encrypted_password = encrypt_new
        self.save
    else
        Logger.new("Wrong old password!")
    end
end
Run Code Online (Sandbox Code Playgroud)

似乎我得到了密码加密错误oldpass包含旧密码的纯文本我需要哈希它看看它是否与当前密码匹配然后允许存储新密码.但是我所得到的只是密码错误.

重做:

def change_password(oldpass, newpass)
    if valid_password?(oldpass)
        password = newpass
        save
        return true
    else
        return false
    end
end
Run Code Online (Sandbox Code Playgroud)

Tom*_*ček 11

如果您在应用程序或Rails控制台中,则无需自己加密密码.

只需按照以下方式更新用户,Devise将自行处理.

user.password = new_password
user.save
Run Code Online (Sandbox Code Playgroud)

然后Devise将加密密码并存储它.你只需要确保user.password_confirmationnil.如果password_confirmation是其他任何东西,它将被匹配password.

编辑

您可以使用以下方法检查现有密码: user.valid_password?(old_password)