我使用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
答案 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。