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 学说事件中对密码进行加密,这样我就可以将加密逻辑限制为一个函数。

我的事件触发得很好,但我需要从教义监听器中获取密码加密服务。这是我迄今为止的尝试:

<?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