语境
我的应用程序在服务器上为多个“全局用户”处理 FTP 帐户(每个用户都有多个 FTP 帐户)。当用户注册时,他将获得他的第一个 FTP 帐户,其凭据与他的全局帐户相同。
例如,如果用户使用myusername和mypassword注册,则将保留两个实体:
- 具有这些凭据和盐的主帐户。
- 第一个 FTP 帐户,我希望拥有完全相同的凭据(相同的用户名、相同的密码、相同的 salt)。
问题
我使用postPersist
Doctrine 事件来创建FTP 帐户。当用户注册(持久化)时,该事件会自动创建一个与该用户关联的FTP 帐户实体,具有相同的凭据。这是来自的代码示例postPersist
:
// $user is the entity passed through the event args ($args->getEntity()).
$ftp = new FTPAccount();
$ftp->setUsername($user->getUsername());
$ftp->setSalt($user->getSalt());
$ftp->setPassword($user->getPassword());
注意:两个实体使用相同的密码编码器,这就是为什么复制密码哈希和盐是合适的。
但问题是:Symfony 认为$user->getPassword()
是明文,因此一旦FTP 帐户实体被持久化,它就会重新散列它。这是由于我的security.yml
文件的这一部分:
security:
encoders:
FTPAccount: sha512
考虑以下事实:
- 我无法获取用户的明文密码
postPersist
,它已经被散列了。 - 我并不总是有散列密码(在这里,我有它,因为它是第一个FTP 帐户)
有没有办法让 Symfony 绕过这个实体实例的密码散列?