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
<?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
<?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
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment