diff --git a/module/Application/src/Application/Acl/IntervenantRole.php b/module/Application/src/Application/Acl/IntervenantRole.php
index d12ce2d5a21f3dcb60575e72ec87d2f2fe03cafc..5d275da8d19de11d2709620c1f9bd8514b13c3f5 100644
--- a/module/Application/src/Application/Acl/IntervenantRole.php
+++ b/module/Application/src/Application/Acl/IntervenantRole.php
@@ -2,41 +2,19 @@
namespace Application\Acl;
-use UnicaenAuth\Acl\NamedRole;
-use Application\Interfaces\StructureAwareInterface;
-use Application\Interfaces\IntervenantAwareInterface;
-use Application\Traits\IntervenantAwareTrait;
-use Application\Traits\StructureAwareTrait;
-
/**
* Description of IntervenantRole
*
- * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
+ * @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr>
*/
-class IntervenantRole extends Role implements StructureAwareInterface, IntervenantAwareInterface
+class IntervenantRole extends Role
{
- use StructureAwareTrait;
- use IntervenantAwareTrait;
-
const ROLE_ID = "intervenant";
public function __construct($id = self::ROLE_ID, $parent = Role::ROLE_ID, $name = 'Intervenant', $description = null, $selectable = true)
{
parent::__construct($id, $parent, $name, $description, $selectable);
}
-
- /**
- *
- * @param Resource|string $resource
- * @param Privilege|string $privilege
- */
- function hasPrivilege( $resource, $privilege )
- {
- if ($statut = $this->getIntervenant()->getStatut()){
- return $statut->hasPrivilege($resource, $privilege);
- }
- return false;
- }
}
diff --git a/module/Application/src/Application/Acl/Role.php b/module/Application/src/Application/Acl/Role.php
index 9e0de1536895a8f776cf02f230ad7f179930acdb..e322502ff86a6c6b807fee5bef0cba5c91da690a 100644
--- a/module/Application/src/Application/Acl/Role.php
+++ b/module/Application/src/Application/Acl/Role.php
@@ -4,8 +4,6 @@ namespace Application\Acl;
use UnicaenAuth\Acl\NamedRole;
use Application\Entity\Db\Role as DbRole;
-use Zend\Permissions\Acl\Resource;
-use Application\Entity\Db\Privilege;
/**
* Rôle père de tous les rôles "administrateur".
@@ -14,6 +12,9 @@ use Application\Entity\Db\Privilege;
*/
class Role extends NamedRole
{
+ use \Application\Traits\StructureAwareTrait,
+ \Application\Traits\PersonnelAwareTrait,
+ \Application\Traits\IntervenantAwareTrait;
const ROLE_ID = 'role';
@@ -35,27 +36,14 @@ class Role extends NamedRole
*
* @return RoleEntity
*/
- function getDbRole()
+ public function getDbRole()
{
- return $this->role;
+ return $this->dbRole;
}
- function setDbRole(DbRole $dbRole)
+ public function setDbRole(DbRole $dbRole)
{
$this->dbRole = $dbRole;
return $this;
}
-
- /**
- *
- * @param Resource|string $resource
- * @param Privilege|string $privilege
- */
- function hasPrivilege( $resource, $privilege )
- {
- if ($typeRole = $this->getTypeRole()){
- return $typeRole->hasPrivilege($resource, $privilege);
- }
- return false;
- }
}
\ No newline at end of file
diff --git a/module/Application/src/Application/Provider/Identity/IdentityProvider.php b/module/Application/src/Application/Provider/Identity/IdentityProvider.php
index 6b615f96ec331903adcde41310e6b5202d58af40..129a93f1ef431efe4ef9513094d90b0fd5fbf6a8 100644
--- a/module/Application/src/Application/Provider/Identity/IdentityProvider.php
+++ b/module/Application/src/Application/Provider/Identity/IdentityProvider.php
@@ -2,16 +2,11 @@
namespace Application\Provider\Identity;
use Application\Acl;
-use Application\Entity\Db\IntervenantExterieur;
-use Application\Entity\Db\IntervenantPermanent;
use Application\Entity\Db\Affectation;
-use Application\Entity\Db\Utilisateur;
-use Common\Exception\RuntimeException;
use UnicaenApp\Service\EntityManagerAwareInterface;
use UnicaenApp\Service\EntityManagerAwareTrait;
use UnicaenAuth\Provider\Identity\ChainableProvider;
use UnicaenAuth\Provider\Identity\ChainEvent;
-use Zend\Permissions\Acl\Role\RoleInterface;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;
@@ -30,11 +25,6 @@ class IdentityProvider implements ServiceLocatorAwareInterface, ChainableProvide
*/
protected $roles;
- public function init()
- {
- $this->getEntityManager()->getFilters()->enable('historique');
- }
-
/**
* {@inheritDoc}
*/
@@ -49,106 +39,45 @@ class IdentityProvider implements ServiceLocatorAwareInterface, ChainableProvide
public function getIdentityRoles()
{
if (null === $this->roles) {
+ $this->getEntityManager()->getFilters()->enable('historique')->init(
+ [
+ 'Application\Entity\Db\Role',
+ 'Application\Entity\Db\Affectation',
+ ],
+ new \DateTime
+ );
+
$this->roles = [];
- if (!$this->getServiceLocator()->get('AuthUserContext')->getIdentity()) {
- return $this->roles;
- }
+ $serviceAuthUserContext = $this->getServiceLocator()->get('AuthUserContext');
+ /* @var $serviceAuthUserContext \UnicaenAuth\Service\UserContext */
+ $utilisateur = $serviceAuthUserContext->getDbUser();
+ /* @var $utilisateur \Application\Entity\Db\Utilisateur */
+
+ if (! $utilisateur) return $this->roles; // pas connecté
/**
* Rôles que possède l'utilisateur dans la base de données.
*/
- $this->roles = array_merge($this->roles, $this->getDbRoles());
+ if ($utilisateur->getPersonnel()) {
+ foreach ($utilisateur->getPersonnel()->getAffectation() as $affectation) {
+ /* @var $affectation Affectation */
+ $roleId = $affectation->getRole()->getCode();
+ if ($structure = $affectation->getStructure()){
+ $roleId .= '-'.$structure->getSourceCode();
+ }
+ $this->roles[] = $roleId;
+ }
+ }
/**
* Rôle correspondant au type d'intervenant auquel appartient l'utilisateur
*/
- $intervenantRole = $this->getIntervenantRole();
- if ($intervenantRole){
- $this->roles[] = $intervenantRole;
+ $intervenant = $utilisateur->getIntervenant();
+ if ($intervenant){
+ $this->roles[] = Acl\IntervenantRole::ROLE_ID;
}
-
}
-
- //var_dump($this->roles);
-
return $this->roles;
}
-
- /**
- * Fetch dans la base de données les rôles que possède l'utilisateur sur une structure précise.
- *
- * @return array Id des rôles trouvés
- */
- protected function getDbRoles()
- {
- $utilisateur = $this->getDbUser();
- $roles = [];
-
- if (!$utilisateur) {
- return $roles;
- }
-
- /**
- * Responsabilités métier importées (tables affectation et TYPE_ROLE)
- */
- if ($utilisateur->getPersonnel()) {
- foreach ($utilisateur->getPersonnel()->getAffectation() as $affectation) { /* @var $affectation Affectation */
- $roleId = $affectation->getRole()->getCode();
- if ($structure = $affectation->getStructure()){
- $roleId .= '-'.$structure->getSourceCode();
- }
- $roles[] = $roleId;
- }
- }
-
- return $roles;
- }
-
- /**
- * Retourne le rôle correspondant au type d'intervenant auquel appartient l'utilisateur.
- *
- * @return RoleInterface|null
- */
- protected function getIntervenantRole()
- {
- $utilisateur = $this->getDbUser();
-
- if (!$utilisateur) {
- return null;
- }
-
- $intervenant = $utilisateur->getIntervenant();
-
- if (!$intervenant) {
- return Acl\IntervenantRole::ROLE_ID;
- }
-
- $statut = $intervenant->getStatut()->getSourceCode();
- if ($statut === \Application\Entity\Db\StatutIntervenant::NON_AUTORISE){
- return null;
- }
-
- if ($intervenant instanceof IntervenantPermanent) {
- $role = Acl\IntervenantPermanentRole::ROLE_ID;
- }
- elseif ($intervenant instanceof IntervenantExterieur) {
- $role = Acl\IntervenantExterieurRole::ROLE_ID;
- }
- else {
- throw new RuntimeException("Type d'intervenant inattendu : " . get_class($intervenant));
- }
-
- return $role;
- }
-
- /**
- * Retourne l'utilisateur connecté.
- *
- * @return Utilisateur
- */
- private function getDbUser()
- {
- return $this->getServiceLocator()->get('AuthUserContext')->getDbUser(); /* @var $dbUser Utilisateur */
- }
}
diff --git a/module/Application/src/Application/Provider/Identity/IdentityProviderFactory.php b/module/Application/src/Application/Provider/Identity/IdentityProviderFactory.php
index f06c977d8957ffb71336fac20d8f1da966c7d658..1ed5169ee4c7f7d753ceea12bd4e63990be647c7 100644
--- a/module/Application/src/Application/Provider/Identity/IdentityProviderFactory.php
+++ b/module/Application/src/Application/Provider/Identity/IdentityProviderFactory.php
@@ -16,7 +16,7 @@ class IdentityProviderFactory implements FactoryInterface
* Create service
*
* @param ServiceLocatorInterface $serviceLocator
- * @return Acteur
+ * @return IdentityProvider
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
@@ -24,7 +24,6 @@ class IdentityProviderFactory implements FactoryInterface
$identityProvider = new IdentityProvider;
$identityProvider->setEntityManager($em);
- $identityProvider->init();
return $identityProvider;
}
}
\ No newline at end of file
diff --git a/module/Application/src/Application/Provider/IdentityProvider.php b/module/Application/src/Application/Provider/IdentityProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..5f2c8538f0d4e1d5fcfc5484e2936f660b41c293
--- /dev/null
+++ b/module/Application/src/Application/Provider/IdentityProvider.php
@@ -0,0 +1,79 @@
+<?php
+namespace Application\Provider\Identity;
+
+use Application\Acl;
+use Application\Entity\Db\IntervenantExterieur;
+use Application\Entity\Db\IntervenantPermanent;
+use Application\Entity\Db\Affectation;
+use Application\Entity\Db\Utilisateur;
+use Common\Exception\RuntimeException;
+use UnicaenApp\Service\EntityManagerAwareInterface;
+use UnicaenApp\Service\EntityManagerAwareTrait;
+use UnicaenAuth\Provider\Identity\ChainableProvider;
+use UnicaenAuth\Provider\Identity\ChainEvent;
+use Zend\Permissions\Acl\Role\RoleInterface;
+use Zend\ServiceManager\ServiceLocatorAwareInterface;
+use Zend\ServiceManager\ServiceLocatorAwareTrait;
+
+/**
+ * Classe chargée de fournir les rôles que possède l'identité authentifiée.
+ *
+ * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
+ */
+class IdentityProvider implements ServiceLocatorAwareInterface, ChainableProvider, EntityManagerAwareInterface
+{
+ use ServiceLocatorAwareTrait;
+ use EntityManagerAwareTrait;
+
+ /**
+ * @var array
+ */
+ protected $roles;
+
+ /**
+ * {@inheritDoc}
+ */
+ public function injectIdentityRoles(ChainEvent $event)
+ {
+ $event->addRoles($this->getIdentityRoles());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getIdentityRoles()
+ {
+ if (null === $this->roles) {
+ $this->roles = [];
+
+ $serviceAuthUserContext = $this->getServiceLocator()->get('AuthUserContext');
+ /* @var $serviceAuthUserContext \UnicaenAuth\Service\UserContext */
+ $utilisateur = $serviceAuthUserContext->getDbUser();
+
+ if (! $utilisateur) return $this->roles; // pas connecté
+
+ /**
+ * Rôles que possède l'utilisateur dans la base de données.
+ */
+ if ($utilisateur->getPersonnel()) {
+ foreach ($utilisateur->getPersonnel()->getAffectation() as $affectation) {
+ /* @var $affectation Affectation */
+ $roleId = $affectation->getRole()->getCode();
+ if ($structure = $affectation->getStructure()){
+ $roleId .= '-'.$structure->getSourceCode();
+ }
+ $this->roles[] = $roleId;
+ }
+ }
+
+ /**
+ * Rôle correspondant au type d'intervenant auquel appartient l'utilisateur
+ */
+ $intervenant = $utilisateur->getIntervenant();
+ if ($intervenant){
+ $this->roles[] = Acl\IntervenantRole::ROLE_ID;
+ }
+ }
+ return $this->roles;
+ }
+}
diff --git a/module/Application/src/Application/Provider/Role/RoleProvider.php b/module/Application/src/Application/Provider/Role/RoleProvider.php
index 0659eb7af00260e456e8afe9c26c8c20b653d5aa..ff48f63ae675fce60f49584a6a8fd52b59a75429 100644
--- a/module/Application/src/Application/Provider/Role/RoleProvider.php
+++ b/module/Application/src/Application/Provider/Role/RoleProvider.php
@@ -2,16 +2,15 @@
namespace Application\Provider\Role;
-use Application\Acl\AdministrateurRole;
use Application\Entity\Db\Affectation;
use Application\Entity\Db\Structure as StructureEntity;
-use Application\Interfaces\StructureAwareInterface;
use BjyAuthorize\Provider\Role\ProviderInterface;
-use Exception;
use UnicaenApp\Exception\LogicException;
use UnicaenApp\Service\EntityManagerAwareInterface;
use UnicaenApp\Service\EntityManagerAwareTrait;
use Zend\Permissions\Acl\Role\RoleInterface;
+use Application\Acl\Role;
+use Application\Acl\IntervenantRole;
/**
* Fournisseur des rôles utilisateurs de l'application :
@@ -34,6 +33,12 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface
*/
protected $roles;
+ /**
+ * @var StructureEntity
+ */
+ protected $structureSelectionnee;
+
+
/**
* Constructeur.
@@ -64,7 +69,7 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface
{
$roles = [];
- // Chargement des rôles de base
+ /* deprecated */
foreach( $this->config as $classname ){
if (class_exists( $classname )){
$role = new $classname; /* @var $role RoleInterface */
@@ -73,7 +78,22 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface
throw new LogicException('La classe "'.$classname.'" déclarée dans la configuration du fournisseur de rôles n\'a pas été trouvée.');
}
}
- if (($utilisateur = $this->getUtilisateur()) && ($personnel = $utilisateur->getPersonnel())){
+ /* fin de deprecated */
+
+ $serviceAuthUserContext = $this->getServiceLocator()->get('AuthUserContext');
+ /* @var $serviceAuthUserContext \UnicaenAuth\Service\UserContext */
+ $utilisateur = $serviceAuthUserContext->getDbUser();
+
+
+ /* Cas spécifique du rôle intervenant */
+ if ($utilisateur && $utilisateur->getIntervenant()){
+ $role = new IntervenantRole;
+ $role->setIntervenant( $utilisateur->getIntervenant() );
+ $roles[$role->getRoleId()] = $role;
+ }
+
+ /* Rôles du personnel */
+ if ($utilisateur && ($personnel = $utilisateur->getPersonnel())){
// chargement des rôles métiers
$qb = $this->getEntityManager()->createQueryBuilder()
->from("Application\Entity\Db\Affectation", "a")
@@ -85,61 +105,21 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface
->andWhere('1=compriseEntre(r.histoCreation,r.histoDestruction)')
->andWhere("a.personnel = :personnel")->setParameter(':personnel', $personnel);
foreach ($qb->getQuery()->getResult() as $affectation) { /* @var $affectation Affectation */
- $roleId = $affectation->getRole()->getCode();
- if (! isset($roles[$roleId])){
- throw new Exception('Le rôle "'.$roleId.'" est inconnu.');
- }
- $classname = get_class($roles[$roleId]);
- if ($roles[$roleId] instanceof StructureAwareInterface && $affectation->getStructure()){
- $roleId .= '-'.$affectation->getStructure()->getSourceCode();
- $roles[$roleId] = new $classname($roleId);
- $roles[$roleId]->setStructure( $affectation->getStructure() );
+ $dbRole = $affectation->getRole();
+ $role = new Role( $dbRole->getCode(), 'user', $dbRole->getLibelle());
+ $role->setDbRole( $dbRole );
+ $role->setPersonnel( $personnel );
+
+ if ($this->structureSelectionnee){
+ $role->setStructure( $this->structureSelectionnee );
}else{
- $roles[$roleId] = new $classname($roleId);
+ $role->setStructure( $affectation->getStructure() );
}
- $roles[$roleId]->setDbRole( $affectation->getRole() );
-
- $this->injectSelectedStructureInRole($roles[$roleId]);
+ $roles[$role->getRoleId()] = $role;
}
}
return $roles;
}
-
- /**
- *
- * @return \Application\Entity\Db\Utilisateur
- */
- public function getUtilisateur()
- {
- $identity = $this->getServiceLocator()->get('AuthUserContext')->getIdentity();
- if (isset($identity['db'])){
- return $identity['db'];
- }else{
- return null;
- }
- }
-
- /**
- * Inject la structure sélectionnée en session dans le rôle Administrateur.
- *
- * @param \Application\Acl\Role $role
- * @return self
- */
- public function injectSelectedStructureInRole($role)
- {
- if (! $role instanceof AdministrateurRole) {
- return $this;
- }
-
- $role->setStructure($this->structureSelectionnee);
-
- return $this;
- }
-
- /**
- * @var StructureEntity
- */
- protected $structureSelectionnee;
public function setStructureSelectionnee(StructureEntity $structureSelectionnee = null)
{
diff --git a/module/Application/src/Application/Service/Context.php b/module/Application/src/Application/Service/Context.php
index e1b5a455f0ee3452a69e5d67603d9cb5db4d2d81..35b625af51693137d114591cbccce3f0d6bb7fe3 100644
--- a/module/Application/src/Application/Service/Context.php
+++ b/module/Application/src/Application/Service/Context.php
@@ -74,7 +74,7 @@ class Context extends AbstractService
protected $sessionContainer;
-
+
/**
@@ -89,23 +89,17 @@ class Context extends AbstractService
if ($authUserContext->getIdentity()) {
$this->selectedIdentityRole = $authUserContext->getSelectedIdentityRole();
- $utilisateur = $authUserContext->getDbUser();
- if ($utilisateur){
- if ($this->selectedIdentityRole instanceof IntervenantAwareInterface) {
- $intervenant = $utilisateur->getIntervenant();
- if (! $intervenant){ // sinon import automatique
- $iSourceCode = (int)$authUserContext->getLdapUser()->getSupannEmpId();
- $intervenant = $this->getServiceIntervenant()->importer($iSourceCode);
- }
- $this->selectedIdentityRole->setIntervenant( $intervenant );
- }
- if ($this->selectedIdentityRole instanceof PersonnelAwareInterface){
- $this->selectedIdentityRole->setPersonnel( $utilisateur->getPersonnel() );
- }
+ if (
+ $this->selectedIdentityRole instanceof \Application\Acl\IntervenantRole
+ && ! $this->selectedIdentityRole->getIntervenant()
+ ){
+ // import automatique
+ $iSourceCode = (int)$authUserContext->getLdapUser()->getSupannEmpId();
+ $intervenant = $this->getServiceIntervenant()->importer($iSourceCode);
+ $this->selectedIdentityRole->setIntervenant( $intervenant ); // injection à la volée de l'intervenant
}
}
}
-
return $this->selectedIdentityRole;
}
@@ -268,7 +262,7 @@ class Context extends AbstractService
$sc->structure = null;
}else{
$role = $this->getSelectedIdentityRole();
- if ($role instanceof StructureAwareInterface && $role->getStructure()){
+ if ($role->getStructure()){
$sc->structure = $role->getStructure()->getId();
}else{
$sc->structure = null;