Laravel中Crypt::encryptString加密字符串运行结果不符合预期
问题原因
你的User模型中定义了smtp_password字段的访问器getSmtpPasswordAttribute,Laravel的访问器机制会在你通过$模型->属性名的方式读取字段值时,自动触发访问器方法做处理。你在访问器里写了自动解密逻辑,所以:
- 你直接读取
$user->smtp_password时,拿到的是访问器解密后的明文,不是数据库中存储的原始密文 - 你后续再手动调用
Crypt::decryptString()去解密已经是明文的内容,自然会抛出payload is invalid的错误,因为明文不是合法的加密 payload。
如何获取数据库存储的原始密文
如果需要读取没有经过访问器处理的原始密文,可以调用模型的getOriginal()方法:
// 拿到数据库里存的加密字符串 $encrypted = $user->getOriginal('smtp_password');
优化建议
你可以配套添加该字段的修改器,实现存值时自动加密,不需要每次手动调用加密方法:
// 在User模型中添加如下方法 public function setSmtpPasswordAttribute($value) { $this->attributes['smtp_password'] = Crypt::encryptString($value); }
添加修改器后,存值可以直接写为:
$user->smtp_password = 'MySecretPassword'; $user->save();
Laravel会自动加密后存入数据库,读取时也会自动解密返回明文,无需手动加解密,也能避免重复解密的错误。
内容的提问来源于stack exchange,提问作者user2197774
相关产品推荐
相关产品推荐

