0

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(),
     );
 }
4

1 に答える 1

1

生のパスワードが使用されるのはなぜだと思いますか? 生のパスワードは確かにネットワーク経由で送信されますが、パスワードを検証するために、Symfony はパスワードのエンコードに使用したものと同じエンコーダーを使用します。

PasswordEncoderInterface のもう 1 つのメソッドであるisPasswordValid()を使用します。これは、エンコードされていない生のパスワードを受け入れます。

アプリに何か他の問題があるはずです。ところで、あなたの塩は生成されていますか?

于 2013-09-06T13:34:27.183 に答える