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

Meilleure prise en compte des rôles au format objet.

parent 5acda6a4
Pipeline #2704 failed with stages
in 2 minutes and 3 seconds
...@@ -50,10 +50,8 @@ class UtilisateurController extends AbstractActionController ...@@ -50,10 +50,8 @@ class UtilisateurController extends AbstractActionController
} }
if ($addFlashMessage) { if ($addFlashMessage) {
$message = sprintf( $selectedRole = $this->getAuthUserContextService()->getSelectedIdentityRoleToString();
"Vous endossez à présent le profil utilisateur <strong>%s</strong>.", $message = sprintf("Vous endossez à présent le profil utilisateur <strong>%s</strong>.", $selectedRole);
$this->getAuthUserContextService()->getSelectedIdentityRole()->getRoleId()
);
$this->flashMessenger()->setNamespace('UnicaenAuth/success')->addMessage($message); $this->flashMessenger()->setNamespace('UnicaenAuth/success')->addMessage($message);
} }
......
<?php
namespace UnicaenAuth\Formatter;
use Zend\Permissions\Rbac\RoleInterface;
class RoleFormatter
{
/**
* Retourne le rôle utilisateur spécifié au format littéral.
*
* @param $role
* @return string
*/
public function format($role)
{
return $this->roleToString($role);
}
/**
* Retourne le rôle utilisateur spécifié au format littéral.
*
* @param object|RoleInterface|string $role
* @return string
*/
private function roleToString($role)
{
$string = '?';
if (is_object($role) && method_exists($role, '__toString')) {
$string = (string) $role;
}
elseif ($role instanceof RoleInterface) {
$string = $role->getRoleId();
}
elseif (is_string($role)) {
$string = $role;
}
return $string;
}
}
\ No newline at end of file
<?php <?php
namespace UnicaenAuth\Provider\Identity; namespace UnicaenAuth\Provider\Identity;
use BjyAuthorize\Provider\Identity\ProviderInterface; use BjyAuthorize\Provider\Identity\ProviderInterface;
...@@ -76,7 +77,7 @@ class Chain implements ProviderInterface, ServiceLocatorAwareInterface, EventMan ...@@ -76,7 +77,7 @@ class Chain implements ProviderInterface, ServiceLocatorAwareInterface, EventMan
// collecte des rôles // collecte des rôles
$this->getEventManager()->trigger('getIdentityRoles', $e); $this->getEventManager()->trigger('getIdentityRoles', $e);
$roles = $e->getRoles(); $roles = $e->getRoles(); /** @var RoleInterface[] $roles */
$authorizeService = $this->getServiceLocator()->get('BjyAuthorize\Service\Authorize'); /* @var $authorizeService Authorize */ $authorizeService = $this->getServiceLocator()->get('BjyAuthorize\Service\Authorize'); /* @var $authorizeService Authorize */
...@@ -88,14 +89,14 @@ class Chain implements ProviderInterface, ServiceLocatorAwareInterface, EventMan ...@@ -88,14 +89,14 @@ class Chain implements ProviderInterface, ServiceLocatorAwareInterface, EventMan
} }
// évite les doublons // évite les doublons
if (!$registry->has($role)) { if (!$registry->has($role)) {
if (is_string($role)) {
$role = $authorizeService->getAcl()->getRole($role); $role = $authorizeService->getAcl()->getRole($role);
}
$registry->add($role); $registry->add($role);
$this->roles[$role->getRoleId()] = $role; $this->roles[$role->getRoleId()] = $role;
} }
} }
// var_dump($this->roles);
return $this->roles; return $this->roles;
} }
......
...@@ -5,21 +5,21 @@ namespace UnicaenAuth\Service; ...@@ -5,21 +5,21 @@ namespace UnicaenAuth\Service;
use BjyAuthorize\Acl\Role; use BjyAuthorize\Acl\Role;
use UnicaenApp\Exception\RuntimeException; use UnicaenApp\Exception\RuntimeException;
use UnicaenApp\Traits\SessionContainerTrait; use UnicaenApp\Traits\SessionContainerTrait;
use UnicaenAuth\Acl\NamedRole;
use UnicaenAuth\Entity\Ldap\People;
use UnicaenAuth\Entity\Shibboleth\ShibUser; use UnicaenAuth\Entity\Shibboleth\ShibUser;
use UnicaenAuth\Event\UserRoleSelectedEvent; use UnicaenAuth\Event\UserRoleSelectedEvent;
use UnicaenAuth\Formatter\RoleFormatter;
use UnicaenAuth\Provider\Identity\Chain; use UnicaenAuth\Provider\Identity\Chain;
use Zend\EventManager\EventManagerAwareInterface; use Zend\EventManager\EventManagerAwareInterface;
use Zend\Session\Container as SessionContainer; use Zend\EventManager\EventManagerAwareTrait;
use Zend\Permissions\Acl\Role\RoleInterface; use Zend\Permissions\Acl\Role\RoleInterface;
use ZfcUser\Entity\UserInterface; use ZfcUser\Entity\UserInterface;
use UnicaenAuth\Entity\Ldap\People;
use UnicaenAuth\Acl\NamedRole;
use Zend\EventManager\EventManagerAwareTrait;
/** /**
* Service centralisant des méthodes utiles concernant l'utilisateur authentifié. * Service centralisant des méthodes utiles concernant l'utilisateur authentifié.
* *
* @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr> * @author Unicaen
*/ */
class UserContext extends AbstractService implements EventManagerAwareInterface class UserContext extends AbstractService implements EventManagerAwareInterface
{ {
...@@ -36,8 +36,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -36,8 +36,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
*/ */
protected $identityRoles; protected $identityRoles;
/** /**
* Retourne l'utilisateur BDD courant * Retourne l'utilisateur BDD courant
* *
...@@ -54,8 +52,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -54,8 +52,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
return null; return null;
} }
/** /**
* Retourne l'utilisateur LDAP courant * Retourne l'utilisateur LDAP courant
* *
...@@ -72,8 +68,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -72,8 +68,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
return null; return null;
} }
/** /**
* Retourne l'éventuel utilisateur Shibboleth courant. * Retourne l'éventuel utilisateur Shibboleth courant.
* *
...@@ -90,8 +84,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -90,8 +84,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
return null; return null;
} }
/** /**
* Retourne les données d'identité correspondant à l'utilisateur courant. * Retourne les données d'identité correspondant à l'utilisateur courant.
* *
...@@ -109,7 +101,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -109,7 +101,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
return $this->identity; return $this->identity;
} }
/** /**
* Retourne l'identifiant de connexion de l'utilisateur courant. * Retourne l'identifiant de connexion de l'utilisateur courant.
* *
...@@ -130,8 +121,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -130,8 +121,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
return null; return null;
} }
/** /**
* @param string $roleId * @param string $roleId
* *
...@@ -147,8 +136,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -147,8 +136,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
return null; return null;
} }
/** /**
* 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é.
* *
...@@ -164,15 +151,16 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -164,15 +151,16 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
$roles = $this->getServiceAuthorize()->getRoles(); $roles = $this->getServiceAuthorize()->getRoles();
$identityProvider = $this->getIdentityProvider(); $identityProvider = $this->getIdentityProvider();
if ($identityProvider instanceof Chain) { if ($identityProvider instanceof Chain) {
$iRoles = $identityProvider->getAllIdentityRoles(); $identityRoles = $identityProvider->getAllIdentityRoles();
} else { } else {
$iRoles = $identityProvider->getIdentityRoles(); $identityRoles = $identityProvider->getIdentityRoles();
} }
foreach ($iRoles as $role) { foreach ($identityRoles as $role) {
if ($role instanceof Role) { if ($role instanceof RoleInterface) {
$this->identityRoles[$role->getRoleId()] = $role; $this->identityRoles[$role->getRoleId()] = $role;
} elseif (isset($roles[$role])) { } elseif (is_string($role) && isset($roles[$role])) {
$role = $roles[$role]; $role = $roles[$role];
/** @var RoleInterface $role */
$this->identityRoles[$role->getRoleId()] = $role; $this->identityRoles[$role->getRoleId()] = $role;
} }
} }
...@@ -181,7 +169,23 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -181,7 +169,23 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
return $this->identityRoles; return $this->identityRoles;
} }
/**
* Retourne tous les rôles de l'utilisateur courant au format littéral.
*
* @return array
* @see getIdentityRoles()
*/
public function getIdentityRolesToString()
{
$f = new RoleFormatter();
$rolesToStrings = [];
foreach ($this->getIdentityRoles() as $identityRole) {
$rolesToStrings[$identityRole->getRoleId()] = $f->format($identityRole);
}
return $rolesToStrings;
}
/** /**
* 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.
...@@ -198,8 +202,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -198,8 +202,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
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é.
...@@ -207,11 +209,10 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -207,11 +209,10 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
* NB: Si un rôle est spécifié en session comme devant être le prochain rôle 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. * c'est lui qui est pris en compte.
* *
* @return mixed * @return RoleInterface
*/ */
public function getSelectedIdentityRole() public function getSelectedIdentityRole()
{ {
if ($this->getNextSelectedIdentityRole()) { if ($this->getNextSelectedIdentityRole()) {
$this->getSessionContainer()->selectedIdentityRole = $this->getNextSelectedIdentityRole(); $this->getSessionContainer()->selectedIdentityRole = $this->getNextSelectedIdentityRole();
} }
...@@ -222,10 +223,9 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -222,10 +223,9 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
} }
$roleId = $this->getSessionContainer()->selectedIdentityRole; $roleId = $this->getSessionContainer()->selectedIdentityRole;
if ($roleId) { if ($roleId) {
// $roles = $this->getServiceAuthorize()->getRoles(); // Récupération de tous les rôles du provider
$roles = $this->getServiceAuthorize()->getRoles(); // Récupération de tous les rôles du provider $roles = $this->getIdentityRoles();
if (isset($roles[$roleId])) { if (isset($roles[$roleId])) {
$role = $roles[$roleId]; $role = $roles[$roleId];
} else { } else {
...@@ -240,7 +240,24 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -240,7 +240,24 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
return null; return null;
} }
/**
* Retourne le rôle utilisateur sélectionné éventuel au format littéral.
*
* @return string
* @see getSelectedIdentityRole()
*/
public function getSelectedIdentityRoleToString()
{
$role = $this->getSelectedIdentityRole();
if (! $role) {
return null;
}
$f = new RoleFormatter();
return $f->format($role);
}
/** /**
* 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.
...@@ -271,8 +288,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -271,8 +288,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
return $this; return $this;
} }
/** /**
* Retourne l'éventuel rôle spécifié en session devant être le prochain rôle sélectionné. * Retourne l'éventuel rôle spécifié en session devant être le prochain rôle sélectionné.
* *
...@@ -283,8 +298,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -283,8 +298,6 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
return $this->getSessionContainer()->nextSelectedIdentityRole; return $this->getSessionContainer()->nextSelectedIdentityRole;
} }
/** /**
* Mémorise en session le rôle devant être le prochain rôle sélectionné. * Mémorise en session le rôle devant être le prochain rôle sélectionné.
* *
...@@ -352,16 +365,15 @@ class UserContext extends AbstractService implements EventManagerAwareInterface ...@@ -352,16 +365,15 @@ class UserContext extends AbstractService implements EventManagerAwareInterface
return false; return false;
} }
/** /**
* *
* @return \UnicaenAuth\Provider\Identity\Chain * @return Chain
*/ */
private function getIdentityProvider() private function getIdentityProvider()
{ {
return $this->getServiceAuthorize()->getIdentityProvider(); /* @var $identityProvider Chain */
/* @var $identityProvider \UnicaenAuth\Provider\Identity\Chain */ $identityProvider = $this->getServiceAuthorize()->getIdentityProvider();
}
return $identityProvider;
}
} }
\ No newline at end of file
<?php <?php
namespace UnicaenAuth\View\Helper;
use Zend\Permissions\Acl\Role\RoleInterface; namespace UnicaenAuth\View\Helper;
/** /**
* Aide de vue permettant d'afficher le profil de l'utilisateur connecté. * Aide de vue permettant d'afficher le profil de l'utilisateur connecté.
...@@ -15,17 +14,12 @@ class UserProfile extends UserAbstract ...@@ -15,17 +14,12 @@ class UserProfile extends UserAbstract
*/ */
protected $userProfileSelectable = false; protected $userProfileSelectable = false;
/**
* @var array
*/
protected $identityRoles;
/** /**
* Point d'entrée. * Point d'entrée.
* *
* @param bool $userProfileSelectable Spécifie s'il faut afficher les profils * @param bool $userProfileSelectable Spécifie s'il faut afficher les profils
* de l'utilisateur sous forme d'une liste déroulante ou de boutons radios, permettant * de l'utilisateur sous forme d'une liste déroulante ou de boutons radios,
* ainsi à l'utilisateur de changer de profil courant. * permettant ainsi à l'utilisateur de changer de profil courant.
* @return self * @return self
*/ */
public function __invoke($userProfileSelectable = false) public function __invoke($userProfileSelectable = false)
...@@ -62,8 +56,7 @@ class UserProfile extends UserAbstract ...@@ -62,8 +56,7 @@ class UserProfile extends UserAbstract
if ($this->userProfileSelectable) { if ($this->userProfileSelectable) {
$html .= $this->getView()->userProfileSelect(false); $html .= $this->getView()->userProfileSelect(false);
} } else {
else {
$html .= $this->getView()->htmlList($roles); $html .= $this->getView()->htmlList($roles);
} }
...@@ -80,19 +73,6 @@ class UserProfile extends UserAbstract ...@@ -80,19 +73,6 @@ class UserProfile extends UserAbstract
return $this->render(); return $this->render();
} }
/**
* Retourne les rôles de l'utilisateur courant.
*
* @return array
*/
protected function getIdentityRoles()
{
if (null === $this->identityRoles) {
$this->identityRoles = $this->getUserContext()->getIdentityRoles();
}
return $this->identityRoles;
}
/** /**
* Retourne les rôles de l'utilisateur courant. * Retourne les rôles de l'utilisateur courant.
* *
...@@ -100,27 +80,7 @@ class UserProfile extends UserAbstract ...@@ -100,27 +80,7 @@ class UserProfile extends UserAbstract
*/ */
protected function getIdentityRolesAsOptions() protected function getIdentityRolesAsOptions()
{ {
$identityRoles = $this->getIdentityRoles(); return $this->getUserContext()->getIdentityRolesToString();
$roles = [];
foreach ($identityRoles as $id => $role) {
$lib = '?';
if (is_object($role) && method_exists($role, '__toString')) {
$lib = (string) $role;
}
elseif ($role instanceof RoleInterface) {
$lib = $role->getRoleId();
}
elseif (is_string($role)) {
$lib = $role;
}
if ($this->getTranslator()) {
$lib = $this->getTranslator()->translate($lib, $this->getTranslatorTextDomain());
}
$roles[$id] = $lib;
}
return $roles;
} }
/** /**
...@@ -134,6 +94,7 @@ class UserProfile extends UserAbstract ...@@ -134,6 +94,7 @@ class UserProfile extends UserAbstract
public function setUserProfileSelectable($userProfileSelectable = true) public function setUserProfileSelectable($userProfileSelectable = true)
{ {
$this->userProfileSelectable = $userProfileSelectable; $this->userProfileSelectable = $userProfileSelectable;
return $this; return $this;
} }
} }
\ 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