首页 > 解决方案 > 如何散列 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"',但是如果我想向用户添加安全问题怎么办?是否有任何默认函数用于散列安全问题的答案?

标签: ruby-on-railsruby

解决方案


如果您的代码现在可以工作,那么您可能has_secure_password在您的模型中。

默认情况下,这会password为您的模型添加一个访问器,并将该值散列到名为password_digest.

您可以通过将名称作为第一个参数传递给来更改列/属性名称has_secure_password

class User < ApplicationRecord

  has_secure_password
  has_secure_password(:security_question_1)
  has_secure_password(:security_question_2)

  ...

这将自动散列user.security_question_1 = "..."到名为security_question_1_digest.

记住:

  • 此方法专门用于存储短用户生成的密码,使用 BCrypt,这意味着它的最大长度为 72 个字符。
  • 此方法还将validates_confirmation_of验证器添加到您的模型中。你可以通过传递来抑制它validations: false

推荐阅读