Где зашифровать / расшифровать мои данные? - PullRequest
6 голосов
/ 04 декабря 2011

Я использую Symfony 2 с Doctrine 2.

Мне нужно зашифровать поле в моем объекте с помощью службы шифрования, и мне интересно, куда мне поместить эту логику.

Я использую архитектуру «Контроллер> Сервис> Репозиторий».

Мне было интересно, будет ли хорошей идеей слушатель, моя главная проблема в том, хранится ли моя сущность в зашифрованном виде, если я расшифрую ее на летуего состояние будет изменено, и я не уверен, что это хорошая идея.

Как бы вы это реализовали?

Ответы [ 3 ]

17 голосов
/ 22 мая 2014

Чтобы расширить возможности richsage и targnation , один из способов добавить зависимость (например, cypto-сервис) в пользовательский тип отображения Doctrine - это использовать статическое свойство и сеттер:

// MyBundle/Util/Crypto/Types/EncryptedString.php
class EncryptedString extends StringType
{
    /** @var \MyBundle\Util\Crypto */
    protected static $crypto;

    public static function setCrypto(Crypto $crypto)
    {
        static::$crypto = $crypto;
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        $value = parent::convertToDatabaseValue($value, $platform);
        return static::$crypto->encrypt($value);
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        $value = parent::convertToPHPValue($value, $platform);
        return static::$crypto->decrypt($value);
    }

    public function getName()
    {
        return 'encrypted_string';
    }
}

Конфигурация будет выглядеть так:

// MyBundle/MyBundle.php
class MyBundle extends Bundle
{
    public function boot()
    {
        /** @var \MyBundle\Util\Crypto $crypto */
        $crypto = $this->container->get('mybundle.util.crypto');
        EncryptedString::setCrypto($crypto);
    }
}

# app/Resources/config.yml
doctrine:
    dbal:
        types:
            encrypted_string: MyBundle\Util\Crypto\Types\EncryptedString

# MyBundle/Resources/config/services.yml
services:
    mybundle.util.crypto:
        class: MyBundle\Util\Crypto
        arguments: [ %key% ]
14 голосов
/ 04 декабря 2011

Я не знаю, является ли это правильным способом, но я недавно реализовал это, создав пользовательский тип отображения , согласно документации Doctrine.Что-то вроде следующего:

class EncryptedStringType extends TextType
{
    const MYTYPE = 'encryptedstring'; // modify to match your type name

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return base64_decode($value);
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return base64_encode($value);
    }

    public function getName()
    {
        return self::MYTYPE;
    }
}

Я зарегистрировал этот тип в своем классе комплектов:

class MyOwnBundle extends Bundle
{
    public function boot()
    {
        $em = $this->container->get("doctrine.orm.entity_manager");
        try
        {
            Type::addType("encryptedstring", "My\OwnBundle\Type\EncryptedStringType");

            $em->
                getConnection()->
                getDatabasePlatform()->
                registerDoctrineTypeMapping("encryptedstring", "encryptedstring");
        } catch (\Doctrine\DBAL\DBALException $e)
        {
            // For some reason this exception gets thrown during
            // the clearing of the cache. I didn't have time to
            // find out why :-)
        }
    }
}

и затем смог ссылаться на него при создании своих сущностей, например:

/**
 * @ORM\Column(type="encryptedstring")
 * @Assert\NotBlank()
 */
protected $name;

Это была быстрая реализация, поэтому мне было бы интересно узнать, как правильно это сделать.Я также предполагаю, что ваш сервис шифрования доступен из контейнера;Я не знаю, насколько возможно / возможно было бы передать услуги в пользовательские типы таким образом ...: -)

8 голосов
/ 15 мая 2013

richsage ответ был довольно хорошим, за исключением того, что я не зарегистрировал бы пользовательский тип в файле класса комплекта.Рекомендуется использовать config.yml следующим образом:

# ./app/config/confi
doctrine:
    dbal:
        driver:   "%database_driver%"
        {{ etc, etc }}
        types:
            encrypted_string: MyCompany\MyBundle\Type\EncryptedStringType

Затем просто убедитесь, что в своем классе EncryptedStringType вы указали функцию getName для возврата encrypted_string.

Теперь в определении модели (или аннотации) вы можете использовать тип encrypted_string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...