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;
...@@ -23,12 +24,12 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -23,12 +24,12 @@ class UserContext implements ServiceLocatorAwareInterface
* @var mixed * @var mixed
*/ */
protected $identity; protected $identity;
/** /**
* @var array * @var array
*/ */
protected $identityRoles; protected $identityRoles;
/** /**
* @var SessionContainer * @var SessionContainer
*/ */
...@@ -46,7 +47,7 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -46,7 +47,7 @@ class UserContext implements ServiceLocatorAwareInterface
return $identity['db']; return $identity['db'];
} }
} }
return null; return null;
} }
...@@ -62,7 +63,7 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -62,7 +63,7 @@ class UserContext implements ServiceLocatorAwareInterface
return $identity['ldap']; return $identity['ldap'];
} }
} }
return null; return null;
} }
...@@ -79,13 +80,13 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -79,13 +80,13 @@ class UserContext implements ServiceLocatorAwareInterface
$this->identity = $authenticationService->getIdentity(); $this->identity = $authenticationService->getIdentity();
} }
} }
return $this->identity; return $this->identity;
} }
/** /**
* Retourne tous les rôles de l'utilisateur courant, pas seulement le rôle courant sélectionné. * Retourne tous les rôles de l'utilisateur courant, pas seulement le rôle courant sélectionné.
* *
* @return array * @return array
*/ */
public function getIdentityRoles() public function getIdentityRoles()
...@@ -94,58 +95,67 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -94,58 +95,67 @@ class UserContext implements ServiceLocatorAwareInterface
$identityProvider = $this->getIdentityProvider(); $identityProvider = $this->getIdentityProvider();
$this->identityRoles = $identityProvider->getAllIdentityRoles(); $this->identityRoles = $identityProvider->getAllIdentityRoles();
} }
return $this->identityRoles; return $this->identityRoles;
} }
/** /**
* Retourne parmi tous les rôles de l'utilisateur courant ceux qui peuvent être sélectionnés. * Retourne parmi tous les rôles de l'utilisateur courant ceux qui peuvent être sélectionnés.
* *
* @return array * @return array
*/ */
public function getSelectableIdentityRoles() public function getSelectableIdentityRoles()
{ {
$filter = function($r) { return !($r instanceof NamedRole && !$r->getSelectable()); }; $filter = function($r) { return !($r instanceof NamedRole && !$r->getSelectable()); };
$roles = array_filter($this->getIdentityRoles(), $filter); $roles = array_filter($this->getIdentityRoles(), $filter);
return $roles; return $roles;
} }
/** /**
* 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();
$roles = $this->getSelectableIdentityRoles(); }
$this->setSelectedIdentityRole(reset($roles));
} 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)) { if ($this->isRoleValid($role)) {
return $role; return $role;
} }
return null; return null;
} }
/** /**
* 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();
...@@ -155,22 +165,58 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -155,22 +165,58 @@ class UserContext implements ServiceLocatorAwareInterface
else { else {
unset($this->getSessionContainer()->selectedIdentityRole); unset($this->getSessionContainer()->selectedIdentityRole);
} }
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; 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)
{ {
if (!$role || is_object($role)) { if (!$role || is_object($role)) {
return $role; return $role;
} }
foreach ($this->getIdentityRoles() as $r) { foreach ($this->getIdentityRoles() as $r) {
if ($r instanceof RoleInterface && $role === $r->getRoleId()) { if ($r instanceof RoleInterface && $role === $r->getRoleId()) {
return $r; return $r;
...@@ -179,14 +225,14 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -179,14 +225,14 @@ class UserContext implements ServiceLocatorAwareInterface
return $r; return $r;
} }
} }
return $role; return $role;
} }
/** /**
* 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)
...@@ -194,7 +240,7 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -194,7 +240,7 @@ class UserContext implements ServiceLocatorAwareInterface
if ($role instanceof RoleInterface) { if ($role instanceof RoleInterface) {
$role = $role->getRoleId(); $role = $role->getRoleId();
} }
foreach ($this->getIdentityRoles() as $r) { foreach ($this->getIdentityRoles() as $r) {
if ($r instanceof RoleInterface) { if ($r instanceof RoleInterface) {
$r = $r->getRoleId(); $r = $r->getRoleId();
...@@ -203,25 +249,25 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -203,25 +249,25 @@ class UserContext implements ServiceLocatorAwareInterface
return true; return true;
} }
} }
return false; return false;
} }
/** /**
* *
* @return \UnicaenAuth\Provider\Identity\Chain * @return \UnicaenAuth\Provider\Identity\Chain
*/ */
private function getIdentityProvider() private function getIdentityProvider()
{ {
$authorize = $this->getServiceLocator()->get('BjyAuthorize\Service\Authorize'); $authorize = $this->getServiceLocator()->get('BjyAuthorize\Service\Authorize');
return $authorize->getIdentityProvider(); /* @var $identityProvider \UnicaenAuth\Provider\Identity\Chain */ return $authorize->getIdentityProvider(); /* @var $identityProvider \UnicaenAuth\Provider\Identity\Chain */
} }
/** /**
* Retourne le stockage en session utilisé pour mémoriser le profil * Retourne le stockage en session utilisé pour mémoriser le profil
* sélectionné par l'utilsateur. * sélectionné par l'utilsateur.
* *
* @return SessionContainer * @return SessionContainer
*/ */
protected function getSessionContainer() protected function getSessionContainer()
...@@ -229,7 +275,7 @@ class UserContext implements ServiceLocatorAwareInterface ...@@ -229,7 +275,7 @@ class UserContext implements ServiceLocatorAwareInterface
if (null === $this->sessionContainer) { if (null === $this->sessionContainer) {
$this->sessionContainer = new SessionContainer(get_class()); $this->sessionContainer = new SessionContainer(get_class());
} }
return $this->sessionContainer; return $this->sessionContainer;
} }
} }
\ No newline at end of file
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