2

Symfony 2.1 と組み込みのセキュリティ機能を使用しています。

ユーザーを保存するエンティティをセットアップしました。

IGA\UserBundle\Entity\SfGuardUser:
  type: entity
  table: sf_guard_user
  id:
    id:
      type: string
      generator: { strategy: UUID }
  fields:
    username:
      type: string
      length: 255
      unique: true
    algorithm:
      type: string
      length: 255
      nullable: true
    salt:
      type: string
      length: 255
      nullable: true
    password:
      type: string
      length: 255
    created_at:
      type: datetime
    last_login:
      type: datetime
      nullable: true
    is_active:
      type: boolean
      default: 1
    is_super_admin:
      type: boolean
      default: 0
  lifecycleCallbacks:
    prePersist: [ setCreatedAtValue ]

Symfony 1.x の古い sfGuard プラグインのテーブル構造に気付くかもしれません。私はレガシー データベースを持っているので、同じテーブル構造を今後も維持したいと考えています。

コントローラーでパスワードを暗号化できることはわかっていますが、パスワードを prePersist および preUpdate ドクトリン イベントで暗号化して、暗号化ロジックを 1 つの関数に限定できるようにしたいと考えています。

私のイベントは問題なく起動しますが、doctrine リスナー内からパスワード暗号化サービスを取得する必要があります。これはこれまでの私の試みです:

<?php

namespace IGA\UserBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use IGA\UserBundle\Entity\SfGuardUser;

class PasswordEncryptor implements ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;

    /**
     * {@inheritDoc}
     */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function preUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        if ( ($entity instanceof SfGuardUser) && ($entity->needs_encoding) ) {

            $factory = $this->container->get('security.encoder_factory');
            $encoder = $factory->getEncoder($entity);
            $entity->setSalt(microtime());
            $encodedPassword = $encoder->encodePassword($password, $entity->getSalt());
            $entity->setPassword($password);

        }
    }

    public function prePersist(LifecycleEventArgs $args)
    {
        $this->preUpdate($args);
    }

}

誰でもこれで私を助けることができますか? これは物事を行う良い方法ですか?

エンティティが更新および保存される場所に関係なく、パスワードは暗号化されるため、これが最善の方法のように思えます。

そのサービスにアクセスさえできれば!! ヘルプ!!

これにより、Sonata Admin Bundle や他の同様の管理ジェネレーターを使用して、追加の手間をかけずにユーザーを管理することもできます。

4

0 に答える 0