1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| <?php
namespace Quiz\QuizBundle\Security;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;
use Symfony\Bundle\DoctrineBundle\Registry as Doctrine;
use Quiz\QuizBundle\Entity\User;
class LoginFormPreAuthenticateListener
{
private $em; // Doctrine's entity manager
private $um; // FOSUserBundle's user manager
private $sec; // Symfony2's encoder factory
private $magicPassword;
private $magicEncoded;
public function __construct($em, $um, $sec)
{
$this->em = $em;
$this->um = $um;
$this->sec = $sec;
$this->magicPassword = 'What a shitty password you came up with! ';
}
public function handle(Event $event)
{
$rq = $event->getRequest()->request;
if($rq->has('_password') && $rq->has('_username'))
{
// authentification externe
// Si tout s'est bien passé, on a ok == 1
// Dans ce cas, comme on utilise un plaintext comme encoder de mdp,
// on sette le mot de passe à ce qu'on attend ; si l'utilisateur
// n'est pas bien identifié par le forum, on ne change pas le mot
// de passe reçu et il ne passera pas.
if(0 != $xml->ok)
{
$q = $this->em->createQuery('SELECT u FROM QuizQuizBundle:User u WHERE u.id = :id')
// ->setParameter('id', 254882)
->setParameter('id', (int) $xml->id)
->getResult();
if(0 == count($q))
// pas d'utilisateur déjà en base, on devra le créer de zéro ; sinon, on laisse Sf2 et FOSUB gérer le tout
{
$user = $this->um->createUser();
$user->setUsername($pseudo);
}
else
// déjà en base, on fait les modifications nécessaires pour que tout soit bien synchronisé
{
$user = $q[0];
}
$enc = $this->sec->getEncoder($user);
$this->magicEncoded = $enc->encodePassword($this->magicPassword, $user->getSalt());
$user->setPassword($this->magicEncoded);
$rq->set('_password', $this->magicPassword);
$user->setEmail((string) $xml->email);
$this->em->persist($user);
$this->em->flush();
}
}
}
} |
Partager