2012-04-13 32 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