我正在使用 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 或任何其他类似的管理生成器来管理我的用户,而无需额外的麻烦。