我在下面提供了一个示例脚本,但我试图弄清楚为什么将相同的密码保存到同一个用户对象会为encrypted_password返回不同的值。这导致大量混淆和密码无法验证,即使通过Devise的valid_password?方法
示例代码:
<% password = 'runbyfruiting'
user1 = User.new(email: 'foo1@bar.com', password: password)
user2 = User.new(email: 'foo2@bar.com', password: password)
user3 = User.new(email: 'foo3@bar.com', password: password)
user4 = user3
%>
<div>user1: <%= user1.encrypted_password %></div>
<div>user2: <%= user2.encrypted_password %></div>
<div>user3: <%= user3.encrypted_password %></div>
<div>user4: <%= user4.encrypted_password %></div>
<% user3.skip_confirmation!
user3.save! %>
<div>user3: <%= user3.encrypted_password %></div>
<% user3.password = password %>
<div>user3: <%= user3.encrypted_password %></div>
<% user4.password = password %>
<div>user4: <%= user4.encrypted_password %></div>
结果:
第1行| user1:$ 2a $ 10 $ B / 2jwwqdDEXhz6Sj0txLHeLpAYpDXfHdXPltuMrzdtWuDRd2gJIUi
第2行| user2:$ 2a $ 10 $ ge9wb8w8CULXYMNBgzJjfeknpIBZI67lSRRod9wCjGEr4tgAjDwbG
第3行| user3:$ 2a $ 10 $ 6xhjZ.TRA / jpXpDUmVLhPOsAvkQUNoVS12o5K.OmjUz2i0xfntzZ。
第4行| user4:$ 2a $ 10 $ 6xhjZ.TRA / jpXpDUmVLhPOsAvkQUNoVS12o5K.OmjUz2i0xfntzZ。
第5行| user3:$ 2a $ 10 $ 6xhjZ.TRA / jpXpDUmVLhPOsAvkQUNoVS12o5K.OmjUz2i0xfntzZ。
第6行| user3:$ 2a $ 10 $ U2obok44brwOGEbyHLrl6O8lNPAQ / DA14pQTLN91iv5hhC7wTZ8Aa
第7行| user4:$ 2a $ 10 $ 06tJre07ZFeLNhaWkWtOfOwevBdSDFa9.uRH4kBRdS5hcnMk3d.X。
答案 0 :(得分:1)
加密密码不同,因为密码是由设备加密的(bcrypt是默认使用的加密方法,但任何体面的方案都必须为了安全起见而这样做)。因此,encrypted_password
中相同的密码应不同(即使在同一对象中重复设置相同的密码)。
这对valid_password?
工作不起作用,因为它使用与加密密码一起存储的相同盐来输入密码,因此如果底层密码相同,则此方法应返回真正。如果它没有按预期运行,那么必须继续其他事情。您需要提供更多详细信息和/或代码来证明问题。