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 や他の同様の管理ジェネレーターを使用して、追加の手間をかけずにユーザーを管理することもできます。