2012-04-13 28 views
4

我已经遵循official documentation关于使用symfony 2标准分发提供的安全性对我的用户进行身份验证,通过Doctrine2将它们保存在数据库中,并且它似乎是关于配置的一切正常,但我总是得到相同的错误:Bad CredentialsSymfony 2安全总是返回Bad凭证错误

我已经使用DoctrineFixturesBundle加载一些用户和角色,并且它似乎完成加载好了。所以,我认为这个问题是在认证过程中的某个地方,这对我来说是透明的......我不知道如何调试,并希望有任何帮助...

谢谢!如果您需要任何其他代码片段,请让我知道,我将编辑该问题。我不是在这里粘贴代码,以使问题更具可读性....

编辑2:由于@Dieter建议,我查了日志,似乎没有数据传递给查询,这是非常奇怪的,因为我遵循他们在the cookbook中提到的每一个约定...这也是我的登录表单的定义。很抱歉,很长的问题!任何帮助将不胜感激! 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, 
    )); 
    } 

应用/日志/ 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/[] [] 

编辑: 由于我的引擎收录链接失效,并且,由彼得的建议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, '[email protected]', 'userpass', $roleUser); 
    $this->loadUser($manager, '[email protected]', 'providerpass', $roleProvider); 
    $this->loadUser($manager, '[email protected]', 'adminpass', $roleAdmin); 
    $this->loadUser($manager, '[email protected]', 'superadminpass', $roleSuperAdmin); 
    } 
} 
+1

你应该在这里添加代码。 btw的pastebin链接被打破(可能已过期) – 2012-04-13 07:40:47

+0

对不起!你是对的,有代码,我希望你能帮助我!谢谢! – Throoze 2012-04-13 08:23:02

回答

9

如果类似的错误与我的情况发生,总是有一些这样的问题在应用中展示/logs/dev.log,或者在像/var/log/apache2/error.log这样的系统日志中。
你看到有什么弹出吗?

编辑:关于你的新的信息

的反应是否有你为什么建立形成自己一个理由?正如您参考的文档中所述,您可以创建树枝模板并为这些字段命名'_username'和'_password'。那么魔法应该为你完成。

+0

嗨!谢谢回答!我更新了我的问题,添加了我在日志中发现的相关信息...似乎没有数据传递给查询,但我不知道可能会导致这种情况,因为我按照[食谱]中提到的每个约定(http ://symfony.com/doc/current/book/security.html#using-a-traditional-login-form)...任何帮助将不胜感激! – Throoze 2012-04-17 08:23:36

+1

你是对的!由于我正在创建一个表单类,所以这个字段的名称被修改为保存表单名称,所​​以它被呈现为'login [_username]'而不是'_username' ......我不知道为什么我没有看到它!!hehehe非常感谢你! – Throoze 2012-04-21 03:04:08

+0

很高兴听到它的工作:-)干杯! – Dieter 2012-04-21 11:23:43