Bcrypt authenticate方法无法验证已存储password_digest问题求助
解决Bcrypt密码验证的问题
嘿,我来帮你搞明白这个事儿~
首先得搞清楚Bcrypt的authenticate方法到底是怎么工作的:它的设计逻辑是接收明文密码,然后把这个明文密码重新哈希,再和数据库里存储的password_digest做比对。你现在用User.find(117).try(:authenticate ,User.find(117).password_digest)返回false,原因很简单——你把已经加密过的摘要传给了authenticate,它会把这个摘要再哈希一次,结果自然和原来的password_digest不匹配啦!
那你要实现“验证数据库中已存储密码”的需求,其实有两种正确的方式:
方式一:用模型自带的authenticate方法(推荐)
这是Rails + Bcrypt最标准的用法,直接传入明文密码就行,authenticate会自动帮你完成和存储的password_digest的比对:
user = User.find(117) user.authenticate("password") # 返回true,说明明文密码和存储的密码匹配
如果返回true,就证明这个明文密码对应用户存储的密码,完全满足验证需求。
方式二:手动用Bcrypt类验证
如果你想直接和数据库里的password_digest做比对,可以用BCrypt::Password类来手动验证:
user = User.find(117) # 把存储的摘要转换成BCrypt::Password对象,再和明文密码对比 BCrypt::Password.new(user.password_digest) == "password" # 同样返回true
这种方式和authenticate的底层逻辑是一样的,只是更手动一些。
额外提醒
千万别尝试用password_digest去作为authenticate的参数,因为authenticate的核心就是对传入的内容重新哈希,加密后的字符串再哈希肯定和原摘要不一样,必然返回false。
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

