has_secure_password以纯文本格式保存密码

时间:2015-03-16 01:26:18

标签: ruby-on-rails ruby ruby-on-rails-4

我使用Robert Reiz的指南here关于在Rails 4中使用has_secure_password为用户模型生成安全密码哈希值。我已经生成了模型和控制器,并且页面正常工作,我可以在new.html.erb中提交表单,并将数据保存到数据库和所有内容,但密码不是哈希,它只是以纯文本保存

这是我的用户模型(user.rb):

class User < ActiveRecord::Base

has_secure_password
    EMAIL_REGEX = /\A[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\z/i
    validates :username, :presence => true, :uniqueness => true, :length => { :in => 3..20 }
    validates :email, :presence => true, :uniqueness => true, :format => EMAIL_REGEX
    validates :password, :length => { :minimum => 5 } 
    validates_confirmation_of :password
end

如果您需要查看其他任何文件,我很乐意添加它们:)

编辑:这是迁移文件:

class CreateUsers < ActiveRecord::Migration

def change
    create_table :users do |t|
      t.string :username
      t.string :password_digest
      t.string :email

      t.timestamps null: false
    end
  end
end

1 个答案:

答案 0 :(得分:0)

您尚未提供有关您的型号的信息,但

  

它需要您的模型中的字段'password_digest'   存储加密密码:

rails g model user username:string password_digest:string

创建创建迁移文件的模型后,必须通过执行迁移在db中创建表,本教程中未提及:

$ bundle exec rake db:migrate

你做到了吗?

此外,该教程中的测试显然是错误的。他们应该是这样的:

require 'spec_helper'

describe User do

  it "fails because no password" do
    User.new({:username => "hans"}).save.should be_false
  end

  it "fails because password to short" do
    User.new(
      username: "hans", 
      password: 'h',
      password_confirmation: 'h').save.should be_false
  end

  it "succeeds because password is long enough" do
    User.new(
      username: "hans",
      password: 'hans is great',
      password_confirmation: 'hans is great'
    ).save.should be_true
  end

end

最后,运行测试不会在 development db 中创建任何用户 - 它将在 test db 中创建用户,并且在测试之后完成运行后,测试数据库中的用户将被销毁,所以当教程说要查看数据库时 - 你不能。

您可以使用 rails控制台来确保操作正常:

$ rails console

然后创建一个用户:

2.0.0-p481 :001 > my_user = User.new(username: 'Hans', password: 'hello', password_confirmation: 'hello')
 => #<User id: nil, username: "Hans", password_digest: "$2a$10$9MHFgIAdODbYBZEBSJGpL.HBbrWOnp0nV7BDm/8oN.yB...", created_at: nil, updated_at: nil> 

请参阅加密的password_digest?然后你可以这样做:

2.0.0-p481 :002 > my_user.save
...
...

然后,如果您检查开发数据库,您应该在数据库中看到用户的信息以及加​​密的password_digest字段。

  

我是否需要将模型中的:密码字段更改为   :password_digest

在开始教程之前,您是否已拥有用户模型?如果是这样,您需要回滚create_users迁移:

$ bundle exec rake db:rollback

..然后销毁用户模型:

$ rails destroy model User

...然后使用适当的列创建一个新的用户模型。

或者,创建一个向现有用户模型添加password_digest列的迁移:

$ rails generate migration add_password_digest_to_users password_digest:string

然后执行迁移:

$ bundle exec rake db:migrate

...并准备测试db:

$ bundle exec rake test:prepare

有关has_secure_password的备用教程,请参阅railstutorial