在我的用户模型中,我有
create_table "users", force: :cascade do |t|
t.string "name"
t.string "email"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.string "password_digest"
end
我不明白t.string "password_digest"
是如何在铁轨上工作的?它会使用默认的哈希函数吗?
Rails不会因为列的名称为password_digest
而自动对其执行任何操作。实际上,任何事情都必须实现密码加密。
Rails在3.1中引入了has_secure_password
,以创建一种处理密码加密的标准化方法,并避免重新设计密码加密轮的陷阱。
# make sure you add bcrypt to the gemfile and run bundle install
class User < ApplicationRecord
has_secure_password
end
它在模型上添加了一个password=
设置器,该设置器使用bcrypt对密码进行散列并设置password_digest
。它还添加了一个password_confirmation=
设置器和验证。
然后,您可以通过调用对用户进行身份验证
class SessionsController
def create
# will be nil or false if the email or password does not check out
@user = User.find_by(params[:email])&.authenticate(params[:password])
if @user
session[:user_id] = @user.id
redirect_to '/somewhere'
else
render :new, notice: 'Invalid email or password'
end
end
end
这将散列params[:password]
的结果与存储在数据库中的值进行比较。当然,如果你不想了解更多关于轮子的信息,就不应该真的重新发明身份验证轮子。对于生产应用程序,你真的应该选择像Devise这样经过战斗测试的解决方案。