如何在rails中为用户使用客户散列函数



在我的用户模型中,我有

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这样经过战斗测试的解决方案。

相关内容

  • 没有找到相关文章

最新更新