启用邮箱加密后,Rails的authenticate_by方法返回nil如何解决?
加密邮箱字段后
authenticate_by无法认证的解决办法 问题出在Rails默认的encrypts用的是非确定性加密——同一个明文每次加密出来的密文都不一样,导致你用明文邮箱查询时,生成的加密值和数据库里存的密文对不上,自然查不到用户,authenticate_by就返回nil了。从你贴的SQL日志也能看出来,查询时传入的明文邮箱被转成了一段加密后的JSON字符串,但因为非确定性加密的特性,这个字符串和数据库里该邮箱的存储值不匹配,所以查不到结果。
要解决这个问题,你需要把邮箱字段改成确定性加密,这样同一明文每次加密结果都相同,才能支持等值查询。修改你的User模型:
class User < ApplicationRecord encrypts :email, deterministic: true end
注意点
- 确定性加密的安全性比非确定性略低(相同明文会生成相同密文),但对于邮箱这种需要用来查询的字段,这是必须的取舍。
- 改完配置后,要重新注册新用户(或者更新现有用户的邮箱字段,让它存储确定性加密后的密文),不然之前用非确定性加密存的旧记录还是查不到。
- 如果用的是Rails 7.1+,也可以用
blind_index来做更安全的查询,但普通场景下deterministic: true足够用了。
改完之后再去用User.authenticate_by(email: params[:email], password: params[:password])就能正常匹配用户并完成认证了。
内容的提问来源于stack exchange,提问作者migu
相关产品推荐
相关产品推荐

