DoctrineEncryptBundle Symfony-加密字段已更新,尽管只选择了实体



在Symfony4上,我使用Ambta\DoctrineEncryptBundle加密数据库中的一些列。

从功能上讲,一切都很好,但日志显示,当选择实体时,如果某个地方发生了刷新,则实体会用加密列中的新值进行更新(纯数据不变,因此这只是性能问题:它不应该更新未更改的内容(。

这里是一个函数的示例,该函数只查询链接到实体Identity(用户的外壳名称/给定名称(的实体User(外壳身份验证数据(。

/**
* @Route("/myaccount2/", name="myAccount2", methods={"GET", "POST"})
* @IsGranted("ROLE_USER")
*/
public function myAccount2(LoggerInterface $logger)
{
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$logger->debug('before');
$em->flush();
$logger->debug('after');
return $this->redirectToRoute('index');
}

这对DB应该没有任何作用,但日志显示:

[2020-05-07 09:42:14] app.DEBUG: before [] []
[2020-05-07 09:42:14] doctrine.DEBUG: "START TRANSACTION" [] []
[2020-05-07 09:42:14] doctrine.DEBUG: UPDATE identity SET name = ?, given_name = ? WHERE id = ? ["MUIEAAYnaoFEu3KQ1Y-HH6XfRb [...]","MUIEADmhmrmQJgV-ITjZymLS-- [...]","a8c39458-8213-4534-9767-57 [...]"] []
[2020-05-07 09:42:14] doctrine.DEBUG: "COMMIT" [] []
[2020-05-07 09:42:14] app.DEBUG: after [] []

查看DB可以发现相应的值实际上已经更新。

以下是所涉及实体的部分定义:

用户

/**
* @ORMEntity(repositoryClass="AppRepositoryUserRepository")
* @UniqueEntity(fields={"email"}, message="security.alreadyused")
*/
class User implements UserInterface
{
/**
* @ORMOneToOne(targetEntity="AppEntityIdentity", mappedBy="User", cascade={"persist", "remove"})
*/
private $identity;

身份

<?php
namespace AppEntity;
use AmbtaDoctrineEncryptBundleConfigurationEncrypted;
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass="AppRepositoryIdentityRepository")
* @UniqueEntity(
*     fields={"alias"},
*     message="public.alias.unique"
* ))
*/
class Identity
{
/**
* @ORMId()
* @ORMColumn(type="string", length=36, nullable=false)
*/
private $id;
/**
* @ORMColumn(type="string", length=1000)
* @Encrypted
*/
private $name;
/**
* @ORMColumn(type="string", length=1000)
* @Encrypted
*/
private $givenName;
/**
* @ORMOneToOne(targetEntity="AppEntityUser", inversedBy="identity", cascade={"persist", "remove"})
* @ORMJoinColumn(nullable=false)
*/
private $User;

注意,如果@encrypted从实体Identity中的两个字段(name和givenName(中删除,则不会对DB:进行更新

[2020-05-07 11:06:18] app.DEBUG: before [] []
[2020-05-07 11:06:18] app.DEBUG: after [] []

感谢您对这种怪异行为的深入了解!

这种行为是由加密引起的。当条令加载实体时,数据被解密。

两种可能性:

  • 当更改和计划此实体进行更新时,原则会检测到解密操作。

  • 在刷新操作中,新加密的数据与加载的数据不同,并且数据在数据库中更新。

库Ambta\DoctrineEncryptBundle需要检测更改并仅在这种情况下更改加密值。

相关内容

  • 没有找到相关文章

最新更新