Commit f9e77f20 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Ajout possibilité de scruter un événement déclenché lors de l'authentification utilisateur.

Seul événement disponible pour l'instant : juste avant que l'entité utilisateur ne soit persistée.
parent 0746de62
Loading
Loading
Loading
Loading
+82 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenAuth\Event\Listener;

use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\ListenerAggregateInterface;
use UnicaenAuth\Event\UserAuthenticatedEvent;

/**
 * Classe abstraites pour les classes désirant scruter un événement déclenché lors de l'authentification
 * utilisateur.
 * 
 * Événements disponibles :
 * - juste avant que l'entité utilisateur ne soit persistée.
 * 
 * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
 * @see UserAuthenticatedEvent
 */
abstract class AuthenticatedUserSavedAbstractListener implements ListenerAggregateInterface
{
    /**
     * @var \Zend\Stdlib\CallbackHandler[]
     */
    protected $listeners = array();
    
    /**
     * @var \Doctrine\ORM\EntityManager
     */
    protected $em;
    
    /**
     * 
     * @param \Doctrine\ORM\EntityManager $em
     */
    public function __construct(\Doctrine\ORM\EntityManager $em)
    {
        $this->em = $em;
    }
    
    /**
     * Renseigne les relations 'intervenant' et 'personnel' avant que l'objet soit persisté.
     * 
     * @param Event $e
     */
    abstract public function onUserAuthenticatedPrePersist(UserAuthenticatedEvent $e);

    /**
     * Attach one or more listeners
     *
     * Implementors may add an optional $priority argument; the EventManager
     * implementation will pass this to the aggregate.
     *
     * @param EventManagerInterface $events
     *
     * @return void
     */
    public function attach(EventManagerInterface $events)
    {
        $sharedEvents      = $events->getSharedManager();
        $this->listeners[] = $sharedEvents->attach(
                'UnicaenAuth\Service\User', 
                UserAuthenticatedEvent::PRE_PERSIST, 
                array($this, 'onUserAuthenticatedPrePersist'), 
                100);
    }

    /**
     * Detach all previously attached listeners
     *
     * @param EventManagerInterface $events
     *
     * @return void
     */
    public function detach(EventManagerInterface $events)
    {
        foreach ($this->listeners as $index => $listener) {
            if ($events->detach($listener)) {
                unset($this->listeners[$index]);
            }
        }
    }
}
 No newline at end of file
+63 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenAuth\Event;

use UnicaenApp\Entity\Ldap\People;
use Zend\EventManager\Event;
use ZfcUser\Entity\UserInterface;

/**
 * Classe des événements déclenchés lors de l'authentification de l'utilisateur.
 *
 * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
 */
class UserAuthenticatedEvent extends Event
{
    const PRE_PERSIST      = 'prePersist';
    const PARAM_DB_USER    = 'db_user';
    const PARAM_LDAP_USER  = 'ldap_user';
    
    /**
     * Retourne l'entité utilisateur issue de la base de données.
     * 
     * @return UserInterface
     */
    public function getDbUser()
    {
        return $this->getParam(self::PARAM_DB_USER);
    }

    /**
     * Retourne l'entité utilisateur issue de l'annuaire LDAP.
     * 
     * @return People
     */
    public function getLdapUser()
    {
        return $this->getParam(self::PARAM_LDAP_USER);
    }

    /**
     * Spécifie l'entité utilisateur issue de la base de données.
     * 
     * @param UserInterface $dbUser
     * @return UserAuthenticatedEvent
     */
    public function setDbUser(UserInterface $dbUser)
    {
        $this->setParam(self::PARAM_DB_USER, $dbUser);
        return $this;
    }

    /**
     * Spécifie l'entité utilisateur issue de l'annuaire LDAP.
     * 
     * @param People $ldapUser
     * @return UserAuthenticatedEvent
     */
    public function setLdapUser(People $ldapUser)
    {
        $this->setParam(self::PARAM_LDAP_USER, $ldapUser);
        return $this;
    }
}
 No newline at end of file
+8 −4
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ use PDOException;
use UnicaenApp\Exception;
use UnicaenApp\Mapper\Ldap\People as LdapPeopleMapper;
use UnicaenAuth\Options\ModuleOptions;
use UnicaenAuth\Event\UserAuthenticatedEvent;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\EventManager\EventManagerAwareInterface;
@@ -99,10 +100,13 @@ class User implements ServiceManagerAwareInterface, EventManagerAwareInterface
            $entity->setPassword('ldap');
            $entity->setState(in_array('deactivated', ldap_explode_dn($ldapPeople->getDn(), 1)) ? 0 : 1);
            
            // trigger pre-persist event
            $event = new \Zend\EventManager\Event(self::EVENT_USER_AUTHENTICATED_PRE_PERSIST);
            $event->setTarget($this)
                ->setParams(array('entity' => $entity, 'ldapPeople' => $ldapPeople));
            // déclenche l'événement donnant aux applications clientes l'opportunité de modifier l'entité 
            // utilisateur avant qu'elle ne soit persistée
            $event = new UserAuthenticatedEvent(UserAuthenticatedEvent::PRE_PERSIST);
            $event
                    ->setDbUser($entity)
                    ->setLdapUser($ldapPeople)
                    ->setTarget($this);
            $this->getEventManager()->trigger($event);
            
            // persist