Skip to content
Snippets Groups Projects
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
No related branches found
No related tags found
No related merge requests found
......@@ -2,6 +2,7 @@
namespace UnicaenAuth\Service;
use UnicaenApp\Exception\RuntimeException;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;
use Zend\Session\Container as SessionContainer;
......@@ -115,18 +116,25 @@ class UserContext implements ServiceLocatorAwareInterface
* 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é.
*
* 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
*/
public function getSelectedIdentityRole()
{
if (null === $this->getSessionContainer()->selectedIdentityRole) {
if ($this->getIdentity()) {
if ($this->getNextSelectedIdentityRole()) {
$this->getSessionContainer()->selectedIdentityRole = $this->getNextSelectedIdentityRole();
}
if (null === $this->getSessionContainer()->selectedIdentityRole && $this->getIdentity()) {
$roles = $this->getSelectableIdentityRoles();
$this->setSelectedIdentityRole(reset($roles));
}
}
$role = $this->normalizedIdentityRole($this->getSessionContainer()->selectedIdentityRole);
$roleId = $this->getSessionContainer()->selectedIdentityRole;
$role = $this->normalizedIdentityRole($roleId);
if ($this->isRoleValid($role)) {
return $role;
}
......@@ -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.
*
* NB: seul l'id du rôle est mémorisé en session.
*
* @param RoleInterface|string $role
* @return \UnicaenAuth\Service\UserContext
* @throws RuntimeException
*/
public function setSelectedIdentityRole($role)
{
if ($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) {
$role = $role->getRoleId();
......@@ -159,11 +169,47 @@ class UserContext implements ServiceLocatorAwareInterface
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.
*
* @param mixed $role
* @return mixed Role trouvé au format objet dans la mesure du possible
* @param RoleInterface|string $role
* @return RoleInterface Role trouvé au format objet dans la mesure du possible
*/
protected function normalizedIdentityRole($role)
{
......@@ -186,7 +232,7 @@ class UserContext implements ServiceLocatorAwareInterface
/**
* Teste si le rôle spécifié fait partie des rôles disponibles.
*
* @param mixed $role
* @param RoleInterface|string $role
* @return boolean
*/
protected function isRoleValid($role)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment