symfony ホームページのガイド (ユーザーのパスワードのエンコードとフォーム ログインのカスタマイズ方法) に従いました。
新しく作成されたユーザーは、暗号化されたパスワードでデータベースに保存されます (暗号化はコントローラーで行われます)。しかし、データベースのユーザーでログインしようとすると、ログインフォームからの生のパスワードとデータベースからの暗号化されたパスワードが比較されるため、認証が失敗します。
だから私の質問は、login_checkの前にログインフォームに来るパスワードを暗号化する方法です? DaoAuthenticationProvider などを拡張するのは適切な解決策でしょうか? または、暗号化をモデルから分離しておくため、私のアプローチは完全に間違っていますか?
security.yml:
security:
encoders:
MyCorp\UserBundle\Entity\User:
algorithm: sha512
encode_as_base64: true
iterations: 1000
providers:
db_users:
entity: {class: MyCorpUserBundle:User, property: username}
ユーザーコントローラー (作成時の暗号化の例):
/**
* Creates a new User entity.
*
* @Route("/", name="user_create")
* @Method("POST")
* @Template("MyCorpUserBundle:User:new.html.twig")
*/
public function createAction(Request $request)
{
$entity = new User();
$factory = $this->get('security.encoder_factory');
$encoder = $factory->getEncoder($entity);
$form = $this->createCreateForm($entity);
$form->handleRequest($request);
if ($form->isValid()) {
$pasword = $encoder->encodePassword($entity->getPassword(), $user->getSalt());
$entity->setPassword($pasword);
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('user_show', array('id' => $entity->getId())));
}
return array(
'entity' => $entity,
'form' => $form->createView(),
);
}