symfony2 login mit Benutzername oder E-Mail
Ich bin mit dem standard-Authentifizierungs-Mechanismus von Symfony2 und ich soll der Benutzer entweder seinen Benutzernamen oder E-Mail anmelden, aber ich kann nicht herausfinden, warum es nicht funktioniert. Getestet hab ich die repository-Klasse und es funktioniert wie erwartet. Ich habe folgte diesem how-to.
Hier ist meine user-provider-Klasse:
<?php
namespace My\UserBundle\Entity;
use Doctrine\ORM\EntityRepository ,
Symfony\Component\Security\Core\User\UserProviderInterface ,
Symfony\Component\Security\Core\User\UserInterface;
/**
* UserRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class UserRepository extends EntityRepository implements UserProviderInterface
{
function loadUserByUsername($username)
{
$qb = $this->createQueryBuilder('u') ;
return
$qb->select('u')
->where(
$qb->expr()->orx(
$qb->expr()->like('u.username' ,':username') ,
$qb->expr()->like('u.email' ,':username')
)
)
//->andWhere($qb->expr()->eq('u.enabled' ,'true') )
->setParameters(array('username' =>$username ) )
->getQuery()
->getResult() ;
}
function refreshUser(UserInterface $user)
{
return $this->loadUserByUsername($user->getUsername() );
}
function supportsClass($class)
{
return $class === 'My\UserBundle\Entity\User';
}
}
- Was meinst du mit "es funktioniert nicht"? Ausführlicher bitte.
- Bitte bewegen Sie Ihre Lösung um das problem aus der Frage eine Antwort und akzeptieren es.
- Hallo Jungs ich kann nicht akzeptieren, meine Antwort 😛 bis morgen
- FFR, ich fand, dass dies ein großer Führer: github.com/FriendsOfSymfony/FOSUserBundle/blob/1.2.0/Resources/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schlage ich vor, eine weitere einfache Methode, die nur benötigt, um Sie auf Sicherheit Bearbeiten.yml Datei.
Müssen Sie zum erstellen von zwei verschiedenen Sicherheits-Anbietern, aber beide mit dem gleichen Benutzer-Klasse. Der erste hat Benutzername als Eigentum und die zweite hat E-Mail als Eigentum.
Dann erstellen Sie ein chain_provider, enthält die beiden Anbieter, und verwenden Sie es in Ihrer firewall den Abschnitt
Ich weiß nicht, ob dieser Ansatz eine saubere übung, aber ist schnell, einfach und es funktioniert ok.
gut Jungs, das Ding ist in meine Sicherheit.yml hatte ich dieses
also musste ich ausziehen, die parameter
property :username
Einnahme aus dem Eigenschaft: Benutzername können die UserProviderInterface laden Sie die Benutzer, wie erwartet, wenn Sie sich meldet, ruft jedoch nicht die refreshUser() Methode als erwartet. Ich habe in überprüft, um zu sehen, wenn es aufgerufen wird, aber es funktioniert nicht.
Die Klasse, lädt der Benutzer bei jedem Zugriff ist ContextListener::refreshUser(TokenInterface $token) Methode. In diesem interface durchläuft die UserProviders und fordert die refreshUser, die erste gibt einen nicht-null-Benutzer.
Konnte ich sicherstellen, dass dies, weil, in der original-Last, kombiniere ich alle verschiedenen Entitäten zu machen, die einen SQL-Aufruf-anstelle von 7. Und wenn der Benutzer lädt, nennt es 7-mal.
Auch die Methode EntityUserProvider::refreshUser() nicht an die repository-Methode und stattdessen lädt direkt aus der Datenbank.
if($this->repository instanceof UserProviderInterface) { return $this->repository->refreshUser($user); }
Ihre provider-Klasse ist richtig, und Sie sind richtig, dass ist das problem bei der Sicherheit.yml, aber deine Lösung ist falsch.
Entsprechend der Dokumentation, Ihre Sicherheit.yml-Datei sollte wie folgt Aussehen:
Beachten Sie, dass die Klasse definiert ist als das Bundle, nicht die direkte Klasse.
Die Art und Weise haben Sie Ihren code jetzt, symfony komplett ignorieren Ihre repository-Klasse, bis Sie definieren Ihre Sicherheit.yml richtig. Und wie @Anand wies darauf hin, nur das entfernen der Eigenschaft nicht aufrufen refreshUser. Allerdings sieht es aus, wenn Sie mit Ihrem eigenen Repository, die Sie nicht brauchen, um die Eigenschaft definieren (da es definiert, die in der Abfrage).