Symfony 2 d'authentification (doctrine) de l'Entité

Je pense que j'ai essayé de tout le code dans tous les posts sur l'authentification avec
(doctrine) de l'Entité dans Symfony 2. Et je ne peux pas le faire fonctionner.
Lorsque j'utilise in_memory fournisseur tous fonctionne bien.
Je suis à l'aide de la PR8.

Mon security.yml

security:
    encoders:
        Partners\FrontendBundle\Entity\User:       plaintext
        Symfony\Component\Security\Core\User\User: plaintext
    providers:
        main:
            entity: { class: FrontendBundle:User, property: username }
        #        in_memory:
        #            users:
        #                sergi:        { password: boo123, roles: [ 'ROLE_USER' ] }
    firewalls:
        main:
            pattern:         /.*
            form_login:      true
            anonymous:       true
            logout:          true
    access_control:
        - { path: /docs.*, role: ROLE_USER }
        - { path: /control.*, role: ROLE_USER }
        - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER

Mon entité User

<?php
namespace Partners\FrontendBundle\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Partners\FrontendBundle\Repository\UserRepository;
/**
* @orm:Entity(repositoryClass="Partners\FrontendBundle\Repository
\UserRepository")
* @orm:Table(name="users")
*/
class User implements UserInterface
{
/**
* @orm:Id
* @orm:Column(type="integer")
* @orm:GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @orm:Column(type="string", length="32", unique=true)
*/
protected $username;
/**
* @orm:Column(type="string", length="255", unique=true)
*/
protected $email;
/**
* @orm:Column(type="string", length="128")
*/
protected $password;
/**
* @orm:Column(type="string", length="128")
*/
protected $organization;
/**
* @orm:Column(type="string", length="128")
*/
protected $contact;
/**
* @orm:Column(type="string", length="16")
*/
protected $phone;
/**
* @orm:Column(type="string", length="10")
*/
protected $cid;
/**
* @orm:Column(type="smallint")
*/
protected $status;
public function getId()
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
}
public function getUsername()
{
return $this->username;
}
public function setUsername($username)
{
$this->username = $username;
}
public function getPassword()
{
return $this->password;
}
public function setPassword($password)
{
$this->password = $password;
}
public function setEmail($email)
{
$this->email = $email;
}
public function getEmail()
{
return $this->email;
}
public function setPhone($phone)
{
$this->phone = $phone;
}
public function getPhone()
{
return $this->phone;
}
public function setContact($contact)
{
$this->contact = $contact;
}
public function getContact()
{
return $this->contact;
}
public function setOrganization($org)
{
$this->organization = $org;
}
public function getOrganization()
{
return $this->organization;
}
public function setCid($cid)
{
$this->cid = $cid;
}
public function getCid()
{
return $this->cid;
}
public function setStatus($status)
{
$this->status = $status;
}
public function getStatus()
{
return $this->status;
}
/**
* Implementing the UserInterface interface
*/
public function __toString()
{
return $this->getUsername();
}
public function getRoles()
{
return array('ROLE_USER');
}
public function eraseCredentials()
{
return false;
}
public function getSalt()
{
return $this->getId();
}
/**
* equals.
*
* @param UserInterface $account
* @return bool
*/
public function equals(UserInterface $account)
{
if ($account->getUsername() != $this->getUsername) {
return false;
}
if ($account->getEmail() != $this->getEmail) {
return false;
}
return true;
}
}

La UserRepository

<?php
namespace Partners\FrontendBundle\Repository;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
class UserRepository extends EntityRepository implements
UserProviderInterface
{
const CREATED  = 0;
const ACTIVE   = 10;
const INACTIVE = 20;
/**
* loadUserByUsername.
*
* @param string $username
* @return Partners\FrontendBundle\Entity\User
*/
public function loadUserByUsername($username)
{
return $this->findOneBy(array('username' => $username));
}
function loadUser(UserInterface $user)
{
return $user;
}
function loadUserByAccount(AccountInterface $account)
{
return $this->loadUserByUsername($account->getUsername());
}
public function supportsClass($class)
{
return true;
}
}

Lorsque je remplis le formulaire de connexion à l'erreur dans le $erreur = $this->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR); est:

exception 'Symfony\Component\Security\Core\Exception
\BadCredentialsException' with message 'Bad credentials' in /var/www/
inspiring/trunk/Symfony/vendor/symfony/src/Symfony/Component/Security/
Core/Authentication/Provider/DaoAuthenticationProvider.php:66 Stack
trace: #0 /var/www/inspiring/trunk/Symfony/vendor/symfony/src/Symfony/
Component/HttpFoundation/SessionStorage/NativeSessionStorage.php(81):
session_start() #1 /var/www/inspiring/trunk/Symfony/app/cache/dev/
classes-53824.php(284): Symfony\Component\HttpFoundation\SessionStorage
\NativeSessionStorage->start() #2 /var/www/inspiring/trunk/Symfony/app/
cache/dev/appDevDebugProjectContainer.php(1151): Symfony\Component
\HttpFoundation\Session->start() #3 /var/www/inspiring/trunk/Symfony/
app/bootstrap.php.cache(109): appDevDebugProjectContainer-
>getSessionService() #4 /var/www/inspiring/trunk/Symfony/app/cache/dev/
classes-53824.php(1553): Symfony\Component\DependencyInjection
\Container->get('session') #5 /var/www/inspiring/trunk/Symfony/app/
cache/dev/classes-53824.php(1544): Symfony\Bundle\FrameworkBundle
\RequestListener->initializeSession(Object(Symfony\Component
\HttpFoundation\Request), true) #6 /var/www/inspiring/trunk/Symfony/
app/cache/dev/classes-53824.php(1214): Symfony\Bundle\FrameworkBundle
\RequestListener->onCoreRequest(Object(Symfony\Component\HttpKernel
\Event\GetResponseEvent)) #7 /var/www/inspiring/trunk/Symfony/vendor/
symfony/src/Symfony/Bundle/FrameworkBundle/Debug/
TraceableEventDispatcher.php(49): Symfony\Component\EventDispatcher
\EventDispatcher->triggerListener(Object(Symfony\Bundle\FrameworkBundle
\RequestListener), 'onCoreRequest', Object(Symfony\Component\HttpKernel
\Event\GetResponseEvent)) #8 /var/www/inspiring/trunk/Symfony/app/
cache/dev/classes-53824.php(1146): Symfony\Bundle\FrameworkBundle\Debug
\TraceableEventDispatcher->triggerListener(Object(Symfony\Bundle
\FrameworkBundle\RequestListener), 'onCoreRequest', Object(Symfony
\Component\HttpKernel\Event\GetResponseEvent)) #9 /var/www/inspiring/
trunk/Symfony/app/cache/dev/classes-53824.php(1734): Symfony\Component
\EventDispatcher\EventDispatcher->dispatch('onCoreRequest',
Object(Symfony\Component\HttpKernel\Event\GetResponseEvent)) #10 /var/
www/inspiring/trunk/Symfony/app/bootstrap.php.cache(411): Symfony
\Bundle\FrameworkBundle\ContainerAwareEventDispatcher-
>dispatch('onCoreRequest', Object(Symfony\Component\HttpKernel\Event
\GetResponseEvent)) #11 /var/www/inspiring/trunk/Symfony/app/
bootstrap.php.cache(400): Symfony\Component\HttpKernel\HttpKernel-
>handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1) #12 /
var/www/inspiring/trunk/Symfony/vendor/symfony/src/Symfony/Bundle/
FrameworkBundle/HttpKernel.php(35): Symfony\Component\HttpKernel
\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request),
1, true) #13 /var/www/inspiring/trunk/Symfony/app/
bootstrap.php.cache(576): Symfony\Bundle\FrameworkBundle\HttpKernel-
>handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#14 /var/www/inspiring/trunk/Symfony/web/app_dev.php(15): Symfony
\Component\HttpKernel\Kernel->handle(Object(Symfony\Component
\HttpFoundation\Request)) #15 {main}

Je ne sais pas d'où le problème peut être.

Comment êtes-vous les mots de passe stockés dans la base de données? En clair?
Oui, j'ai stocké en clair dans le texte en développement. Maintenant, je suis dans la production et la encripted.
Saler aurait été ma prochaine deviner 😉
Puis-je vous demander: pourquoi êtes-vous à l'aide de la même classe que l'utilisateur du référentiel et de l'utilisateur fournisseur? J'ai suivi ton exemple et a fait de même, et plus tard, il fait qu'il est extrêmement difficile pour moi de comprendre comment l'utiliser une seconde base de données pour les utilisateurs.
Je ne pouvais pas laisser passer l'EntityManager à l'utilisateur fournisseur du service des arguments, parce que les arguments 2 et 3 de l'objet entityrepository constructeur sont mixed classet ClassMetadata classMetadata, et je ne pouvais pas comprendre ce qu'il faut utiliser dans services.yml. J'ai fini par ne pas sous-classement d'objet entityrepository, à l'aide de l'EntityManager que le seul argument du constructeur, et de le transmettre comme @doctrine.orm.mymanager_entity_manager.

OriginalL'auteur Sergi | 2011-03-23