Commit 6efa4f5e authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Ajout possibilité de spécifier (mémoriser en session) le rôle devant être le...

Ajout possibilité de spécifier (mémoriser en session) le rôle devant être le prochain rôle sélectionné. Si un rôle est spécifié en session comme devant être le prochain rôle sélectionné, c'est lui qui est pris en compte comme rôle courant.
parent 462d0307
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
namespace UnicaenAuth\Service; namespace UnicaenAuth\Service;
use UnicaenApp\Exception\RuntimeException;
use Zend\ServiceManager\ServiceLocatorAwareInterface; use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait; use Zend\ServiceManager\ServiceLocatorAwareTrait;
use Zend\Session\Container as SessionContainer; use Zend\Session\Container as SessionContainer;
...@@ -115,18 +116,25 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -115,18 +116,25 @@ class UserContext implements ServiceLocatorAwareInterface
* Si un utilisateur est authentifié, retourne le rôle utilisateur sélectionné, * Si un utilisateur est authentifié, retourne le rôle utilisateur sélectionné,
* ou alors le premier sélectionnable si aucun n'a été sélectionné. * ou alors le premier sélectionnable si aucun n'a été sélectionné.
* *
* NB: Si un rôle est spécifié en session comme devant être le prochain rôle sélectionné,
* c'est lui qui est pris en compte.
*
* @return mixed * @return mixed
*/ */
public function getSelectedIdentityRole() public function getSelectedIdentityRole()
{ {
if (null === $this->getSessionContainer()->selectedIdentityRole) { if ($this->getNextSelectedIdentityRole()) {
if ($this->getIdentity()) { $this->getSessionContainer()->selectedIdentityRole = $this->getNextSelectedIdentityRole();
}
if (null === $this->getSessionContainer()->selectedIdentityRole && $this->getIdentity()) {
$roles = $this->getSelectableIdentityRoles(); $roles = $this->getSelectableIdentityRoles();
$this->setSelectedIdentityRole(reset($roles)); $this->setSelectedIdentityRole(reset($roles));
} }
}
$role = $this->normalizedIdentityRole($this->getSessionContainer()->selectedIdentityRole); $roleId = $this->getSessionContainer()->selectedIdentityRole;
$role = $this->normalizedIdentityRole($roleId);
if ($this->isRoleValid($role)) { if ($this->isRoleValid($role)) {
return $role; return $role;
} }
...@@ -136,16 +144,18 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -136,16 +144,18 @@ class UserContext implements ServiceLocatorAwareInterface
/** /**
* Mémorise en session le rôle spécifié comme étant le rôle courant de l'utilisateur. * Mémorise en session le rôle spécifié comme étant le rôle courant de l'utilisateur.
*
* NB: seul l'id du rôle est mémorisé en session. * NB: seul l'id du rôle est mémorisé en session.
* *
* @param RoleInterface|string $role * @param RoleInterface|string $role
* @return \UnicaenAuth\Service\UserContext * @return \UnicaenAuth\Service\UserContext
* @throws RuntimeException
*/ */
public function setSelectedIdentityRole($role) public function setSelectedIdentityRole($role)
{ {
if ($role) { if ($role) {
if (!$this->isRoleValid($role)) { if (!$this->isRoleValid($role)) {
throw new \Common\Exception\RuntimeException("Rôle spécifié invalide."); throw new RuntimeException("Rôle spécifié invalide.");
} }
if ($role instanceof RoleInterface) { if ($role instanceof RoleInterface) {
$role = $role->getRoleId(); $role = $role->getRoleId();
...@@ -159,11 +169,47 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -159,11 +169,47 @@ class UserContext implements ServiceLocatorAwareInterface
return $this; return $this;
} }
/**
* Retourne l'éventuel rôle spécifié en session devant être le prochain rôle sélectionné.
*
* @return string|null
*/
private function getNextSelectedIdentityRole()
{
return $this->getSessionContainer()->nextSelectedIdentityRole;
}
/**
* Mémorise en session le rôle devant être le prochain rôle sélectionné.
*
* NB: seul l'id du rôle est mémorisé en session ; la durée de vie du stockage est de 1 requête seulement.
*
* @param RoleInterface|string $role
* @return \UnicaenAuth\Service\UserContext
*/
public function setNextSelectedIdentityRole($role)
{
if ($role instanceof RoleInterface) {
$role = $role->getRoleId();
}
if ($role) {
$this->getSessionContainer()->nextSelectedIdentityRole = $role;
$this->getSessionContainer()->setExpirationHops(1, 'nextSelectedIdentityRole');
}
else {
unset($this->getSessionContainer()->nextSelectedIdentityRole);
}
return $this;
}
/** /**
* Recherche le role spécifié parmi les rôles connus au format objets. * Recherche le role spécifié parmi les rôles connus au format objets.
* *
* @param mixed $role * @param RoleInterface|string $role
* @return mixed Role trouvé au format objet dans la mesure du possible * @return RoleInterface Role trouvé au format objet dans la mesure du possible
*/ */
protected function normalizedIdentityRole($role) protected function normalizedIdentityRole($role)
{ {
...@@ -186,7 +232,7 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -186,7 +232,7 @@ class UserContext implements ServiceLocatorAwareInterface
/** /**
* Teste si le rôle spécifié fait partie des rôles disponibles. * Teste si le rôle spécifié fait partie des rôles disponibles.
* *
* @param mixed $role * @param RoleInterface|string $role
* @return boolean * @return boolean
*/ */
protected function isRoleValid($role) protected function isRoleValid($role)
......
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