5

symfony 2 標準ディストリビューションが提供するセキュリティを使用してユーザーを認証し、Doctrine2 を介してデータベースに永続化することに関する公式ドキュメントに従いましたが、構成に関してはすべて問題ないように見えますが、常に同じエラーが発生します: Bad Credentials.

DoctrineFixturesBundle を使用して一部のユーザーとロールをロードしましたが、ロードは正常に完了したようです。したがって、問題は認証プロセスのどこかにあると思います。これは私には透過的です...これをデバッグする方法がわからないので、助けていただければ幸いです...

ありがとう!他のコード スニペットが必要な場合はお知らせください。質問を編集します。質問を読みやすくするために、ここにコードを貼り付けていません....

EDIT 2 : @Dieterで示唆されているように、ログを確認しましたが、クエリにデータが渡されていないようです。これは、クックブックで言及されているすべての規則に従っているため、非常に奇妙です...ここに私のログインフォーム。質問が長くなってすみません!どんな助けでも大歓迎です!

LoginType.php のスニペット:

  public function buildForm(FormBuilder $builder, array $options) {
    $builder->add('_username', 'text', array(
        'label' => 'Email ',
        'required' => true,
    ));
    $builder->add('_password', 'password', array(
        'label' => 'Password ',
        'required' => true,
    ));
    $builder->add('_remember_me', 'checkbox', array(
        'label' => 'Remember me ',
        'required' => false,
    ));
  }

app/logs/dev.log 出力:

[2012-04-17 03:43:01] event.DEBUG: Notified event "kernel.request" to listener
                      "Symfony\Component\Security\Http\Firewall::onKernelRequest".
                      [] []
[2012-04-17 03:43:01] doctrine.DEBUG: SET NAMES UTF8 ([]) [] []
[2012-04-17 03:43:01] doctrine.DEBUG: SELECT t0.id AS id1, t0.username AS
                      username2, t0.salt AS salt3, t0.password AS password4,
                      t0.is_active AS is_active5, t0.mailer_id AS mailer_id6
                      FROM SfUser t0 WHERE t0.username = ? (["NONE_PROVIDED"])
                      [] []
[2012-04-17 03:43:01] security.INFO: Authentication request failed: Bad
                      credentials [] []
[2012-04-17 03:43:01] security.DEBUG: Redirecting to / [] []

編集: 私のペーストビン リンクの有効期限が切れたため、Peter Porfey が提案したように、これはコードです:

これは私の security.yml です

security:
    encoders:
        ElCuadre\AccountBundle\Entity\User: sha512

    role_hierarchy:
        ROLE_ADMIN:       [ROLE_USER, ROLE_PROVIDER]
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_PROVIDER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        user_db:
            entity: { class: ElCuadre\AccountBundle\Entity\User, property: username}

    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false
        secured_area:
            pattern:  ^/
            anonymous: ~
            form_login:
                login_path: /
                check_path: /login_check
            logout:
                path:   /logout
                target: /
            remember_me:
              key:      %secret%
              lifetime: 3600
              path:     /
              domain:   ~ # Defaults to the current domain from $_SERVER

    access_control:
        - { path: ^/$, roles: IS_AUTHENTICATED_ANONYMOUSLY }

そして私のコントローラー:

public function loginAction() {
    $request = $this->getRequest();
    $session = $request->getSession();

    // get the login error if there is one
    if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
      $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
    } else {
      $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
      $session->remove(SecurityContext::AUTHENTICATION_ERROR);
    }

    $form = $this->createForm(new LoginType());
    return $this->render(
                    'ElCuadreAccountBundle:Auth:login.html.twig',
                     array(
                         'form'         => $form->createView(),
                         'last_username' => $session->get(
                                              SecurityContext::LAST_USERNAME),
                         'error'       => $error,
                         )
    );
}

フィクスチャ ファイルのコードは次のとおりです。

<?php

namespace ElCuadre\AccountBundle\DataFixtures\ORM;

use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\DataFixtures\AbstractFixture;
use ElCuadre\AccountBundle\Entity\User;
use ElCuadre\AccountBundle\Entity\Role;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class LoadAccountData extends AbstractFixture implements FixtureInterface, ContainerAwareInterface {

  private $container;

  public function setContainer(ContainerInterface $container = null) {
    $this->container = $container;
  }

  private function loadRole($manager, $name, $roleName) {
    $role = new Role();
    $role->setName($name);
    $role->setRole($roleName);
    $manager->persist($role);
    $manager->flush();
    return $role;
  }

  private function loadUser($manager, $username, $password, $roles) {
    $user = new User();
    $user->setUsername($username);
    $encoder = $this->container->get('security.encoder_factory')->getEncoder($user);
    $user->setPassword($encoder->encodePassword($password, $user->getSalt()));
    foreach ($roles as $role) {
      $user->addRole($role);
    }
    $manager->persist($user);
    $manager->flush();
  }

  public function load(ObjectManager $manager) {
    // Roles:
    $roleUser = $this->loadRole($manager, 'user', 'ROLE_USER');
    $roleProvider = $this->loadRole($manager, 'provider', 'ROLE_PROVIDER');
    $roleAdmin = $this->loadRole($manager, 'admin', 'ROLE_ADMIN');
    $roleSuperAdmin = $this->loadRole($manager, 'superadmin', 'ROLE_SUPER_ADMIN');
    // Users:
    $this->loadUser($manager, 'user@elcuadre.com', 'userpass', $roleUser);
    $this->loadUser($manager, 'provider@elcuadre.com', 'providerpass', $roleProvider);
    $this->loadUser($manager, 'admin@elcuadre.com', 'adminpass', $roleAdmin);
    $this->loadUser($manager, 'superadmin@elcuadre.com', 'superadminpass', $roleSuperAdmin);
  }
}
4

1 に答える 1

9

my で同様のエラーが発生した場合、常に何らかの問題が app/logs/dev.log や /var/log/apache2/error.log などのシステム ログに表示されます。
そこに何かが飛び出しているのが見えますか?

編集:あなたの新しい情報への反応として

そのフォームを自分で作る理由はありますか?参照するドキュメントに記載されているように、小枝テンプレートを作成して、フィールドに「_username」と「_password」という名前を付けることができます。魔法はあなたのために行われるべきです。

于 2012-04-14T08:50:00.243 に答える