gpt4 book ai didi

ruby - 覆盖欧姆模型的属性

转载 作者:可可西里 更新时间:2023-11-01 11:21:51 27 4
gpt4 key购买 nike

我遇到了一个非常奇怪的 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 对其进行加密,但由于某些原因,每次我调用该属性时密码都不同。我不知道这里发生了什么,有人可以帮助我吗?

最佳答案

当 Ohm 从数据库加载属性时,它不会分配它直接@attributes。相反,它使用访问器来允许任何类型的类型转换。在你的情况下,发生的是每个time Ohm 从 Redis 加载密码字段,它再次处理它与BCrypt。你可以check the code in question .

我通常做的有点不同:我定义一个属性crypted_pa​​ssword 在 Ohm 中,然后在模型中我定义了一个方法password= 接受一个字符串并生成加密版本,然后存储在 crypted_pa​​ssword 属性中。我用 gem 称为盾牌,here's the relevant code .

您可以做类似于 Shield 所做的事情,并使用 BCrypt反而。您必须定义属性 crypted_pa​​ssword,然后是名为 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_pa​​ssword验证用户。

关于ruby - 覆盖欧姆模型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25288409/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com