0

我遇到了一个非常奇怪的 Ohm 问题,我无法跟踪和解决。欧姆版本是 2.0.1。

这是我的代码:

class User < Ohm::Model
  attribute :username
  attribute :password

  index :username

  def password= string
    @attributes[:password] = BCrypt::Password.create(string) # Tried self.password = BCrypt::whatever too
  end
end

[15] pry(main)> User.find(username: 'test').first.password
=> "$2a$10$j1.s4hmuyCm8RffaEvB8IejaYOiZXWXId1Ccf8S0K3uXduxmMzyUq"
[16] pry(main)> User.find(username: 'test').first.password
=> "$2a$10$/0UzWtVsF.xczf4.UUqrP.PqYHxKs8fkIWKHlVVQVUNPFubzmuCwO"
[17] pry(main)> User.find(username: 'test').first.password
=> "$2a$10$ajlc3BYMOFXYDmy1a112ieXhMm39KoR1wPdPMp4WwEnxb2E35ypvC"
[18] pry(main)> User.find(username: 'test').first.password
=> "$2a$10$TlW87Gpd4RKpPutWzkePqeQiGri2ah.txDda4o6Lki7Sk1vayY9Fm"

基本上我可以设置密码并使用 BCrypt 对其进行加密,但由于某些原因,每次我调用属性时密码都是不同的。我不知道这里发生了什么,有人可以帮助我吗?

4

1 回答 1

1

当 Ohm 从数据库加载属性时,它不会直接将其分配给 @attributes。相反,它使用访问器来允许任何类型的类型转换。在您的情况下,发生的事情是每次 Ohm 从 Redis 加载密码字段时,它都会使用 BCrypt 再次处理它。您可以检查有问题的代码

我通常做的有点不同:我 crypted_password在 Ohm 中定义一个属性,然后在模型中定义一个方法 ,该方法password=接受一个字符串并生成加密版本,然后将其存储在crypted_password属性中。我使用了一个叫做 Shield 的 gem,这里是相关代码

您可以做类似于 Shield 所做的事情,并改用 BCrypt。您必须定义一个属性crypted_password,然后定义一个password=与您当前拥有的方法有点不同的方法:

class User < Ohm::Model
  attribute :username
  attribute :crypted_password

  index :username

  def password= string
    self.crypted_password = BCrypt::Password.create(string)
  end
end

这应该可以工作,您将不得不使用它crypted_password来验证用户。

于 2014-08-13T14:57:47.450 回答