【问题标题】:Encrypt User's password in seed file加密种子文件中的用户密码
【发布时间】:2015-09-10 15:17:53
【问题描述】:

我需要使用加密密码为用户播种,但我没有使用 Devise。所以我尝试了这个:

user = UserManager::User.new({ :name => 'a', :surname => 'a', :email => 'a', :active => true, :password_hash => 'password', :password_salt => 'password'})
user.save

但是这样放置password_hash和password_salt是不对的,我发现我必须改用password和password_confirmation

user = UserManager::User.new({ :name => 'a', :surname => 'a', :email => 'a', :active => true, :password => 'password', :password_confirmation => 'password'})
user.save

但是这两个字段是未知的,因为它们不在数据库中,所以我该如何用种子加密密码?

编辑

用户模型

attr_accessor :password
has_secure_password
before_save :encrypt_password

def encrypt_password
  if password.present?
    self.password_salt = BCrypt::Engine.generate_salt
    self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
  end
end

【问题讨论】:

    标签: ruby-on-rails passwords


    【解决方案1】:

    您不需要password 的属性访问器。使用 has_secure_password 即可免费获得。

    对于种子用户,我建议使用 Hartl 教程中的方法。

    用户模型

    添加手动生成密码摘要的方法:

    # Returns the hash digest of the given string.
    def User.digest(string)
      cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                    BCrypt::Engine.cost
      BCrypt::Password.create(string, cost: cost)
    end
    

    种子文件

    User.create!(name: 'foo',
                 email: 'foo@bar.com',
                 password_digest: #{User.digest('foobar')} )
    

    【讨论】:

    • 好的,谢谢,我试试这个。我应该将 password_digest 添加到我的数据库吗?
    • 是的@Simon。这将是您的用户明文密码的散列版本,并且应该是您数据库中唯一与密码相关的数据。
    • 其实,我是按照railscasts.com/episodes/270-authentication-in-rails-3-1 进行身份验证的,而且我的数据库中已经有了password_hash 和password_salt,所以我认为在我的数据库中添加password_digest 是不对的
    • 嗯,Railscast 至少在 ASCII 转换中引用了 password_digest 属性。如果您朝那个方向发展,也许您可​​以使用 password_hash 代替它。您需要某种辅助方法来调用种子文件中的 BCrypt 密码方法。
    • 糟糕,错误的链接对不起,这个:railscasts.com/episodes/250-authentication-from-scratch ... 是的,我认为这是在种子文件中使用 BCrypt 的最佳解决方案,但我是 Rails 新手,真的不知道该怎么做
    【解决方案2】:

    在您的模型中:

    class User < ApplicationRecord
        has_secure_password
    end
    

    在种子.rb 文件中:

    User.create(username: "username", 
         ...
    password_digest: BCrypt::Password.create('Your_Password'))
    

    【讨论】:

      【解决方案3】:

      您可以创建密码哈希,如下所示:

      require 'digest/sha1'
      encrypted_password= Digest::SHA1.hexdigest(password)
      

      您可以在种子.rb 文件中使用此代码来加密密码。但是好像你已经写了一个方法encrypt_password。现在,您可以在before_save 回调中调用此方法。所以每次有一个用户即将被存入数据库时​​,encrypt_password就会被调用。

      【讨论】:

      • 我正在使用 BCrypt 来加密我的密码,这会改变什么吗?我应该把这段代码放在哪里?我的问题之一是我无法在种子文件中使用“密码”
      • 我已经更新了我的用户模型。我已经有一个 before_save 回调。当我想为用户播种时出现我的问题,“密码”属性无法识别
      猜你喜欢
      • 2010-10-23
      • 2023-03-10
      • 2023-04-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多