Laravel 5.5中Encryptable Trait导致认证失败问题求助
解决Laravel 5.5中Encryptable trait导致的登录认证失败问题
我之前在Laravel 5.5项目里用Encryptable trait时也碰到过一模一样的问题——注册时数据加密正常存进数据库,但登录时Auth::attempt($credentials)死活过不了。后来仔细排查才发现,问题出在密码字段的加密逻辑和Laravel默认认证流程的冲突上。
问题根源
Laravel默认的认证流程是:
- 注册时,把用户输入的密码通过
bcrypt()哈希后存入数据库 - 登录时,
Auth::attempt()会自动把输入的密码哈希,然后和数据库里的哈希值比对
但如果你给User模型的$encryptable数组加了password字段,注册时会先哈希密码,再把哈希值加密后存入数据库。这时候Auth::attempt()拿输入的密码哈希后,去和数据库里加密后的哈希值比对,自然匹配不上,导致认证失败。
解决方案
方案1:移除密码字段的加密(推荐)
密码本身已经通过哈希存储,安全性足够,不需要额外加密。直接在User模型里把password从$encryptable数组中移除:
class User extends Authenticatable { use Encryptable; protected $encryptable = [ // 只保留需要加密的其他字段,比如email、phone等,去掉password 'email', 'phone', ]; }
这样注册和登录流程就会回到Laravel默认逻辑,Auth::attempt()就能正常工作了。
方案2:重写用户模型的认证密码获取方法(如果必须加密密码字段)
如果业务需求必须加密密码字段,那需要在User模型里重写getAuthPassword()方法,让它返回解密后的密码哈希值,供Auth::attempt()比对:
class User extends Authenticatable { use Encryptable; protected $encryptable = [ 'password', 'email', // 其他需要加密的字段 ]; /** * 重写认证密码获取方法,返回解密后的哈希密码 * @return string */ public function getAuthPassword() { return decrypt($this->password); } }
这样Auth::attempt()会用输入的密码哈希后,和这个解密出来的原始哈希值比对,就能成功完成认证了。
额外注意事项
- 确保数据库的
password字段长度足够:加密后的字符串会比原哈希值长很多,建议设置为varchar(255)或更长 - 确认APP_KEY的一致性:如果部署环境的APP_KEY和本地不一致,会导致解密失败,认证自然也过不了
内容的提问来源于stack exchange,提问作者Neurax
相关产品推荐
相关产品推荐

