2

我刚刚开始使用MongoDB,特别是Mongoid.

自然,我想确保我User的密码保持良好和安全,以前我会这样做ActiveRecord并使用bcrypt. 我正在寻找一种漂亮、干净、安全、简单的方法来使用Mongoid.

我已经查看了mongoid-encryptor,但我还没有完全了解如何使用它。

假设我的简化User看起来像这样,根据mongoid-encryptor自述文件中的示例。

class User
  include Mongoid::Document
  include Mongoid::Encryptor
  field :name
  field :password
  encrypts :password
end

在我的 WebApp 中(Sinatra在这种情况下使用)我会定义一个助手,例如

def login (name, cleartxtpass)
  return User.where(name: name, password: cleartxtpass).first
end
  1. 我如何使用它bcrypt
  2. 是否有任何预处理我需要做cleartxtpassMongoid::Encryptor只处理?从文档中不清楚。
4

2 回答 2

4

好吧,经过一番挖掘,我决定不再费心使用Mongoid::Encryptor,而是坚持我在使用ActiveRecord.

所以现在我的User样子

class User
  include Mongoid::Document
  field :name, type: String
  field :password_hash, type: String
  index({name: 1}, {unique: true, name: 'user_name_index'})

  include BCrypt
  def password
    @password ||= Password.new(password_hash)
  end

  def password=(new_password)
    @password = Password.create(new_password)
    self.password_hash = @password
  end
end

我的身份验证辅助方法看起来像

  def auth_user(username, password)
    user = User.where(name: username).first
    return user if user && user.password == password
    return nil
  end

这是一种享受。

于 2013-04-24T06:08:18.843 回答
0

简单的方法是:

class User
  include Mongoid::Document
  include ActiveModel::SecurePassword

  field :name, type: String
  field :password_digest, type: String

  has_secure_password
end

于 2018-03-20T13:52:56.327 回答