Commit a5ad5b62 authored by David Surville's avatar David Surville
Browse files

Prise en compte des rôles automatiques dans la gestion des périmètres

parent 16d6a0b9
Loading
Loading
Loading
Loading
+7 −2
Changes for src/UnicaenUtilisateur/Provider/Identity/IdentityService.php: 7 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ namespace UnicaenUtilisateur\Provider\Identity;

use UnicaenUtilisateur\Entity\Db\RoleInterface;
use UnicaenUtilisateur\Entity\Db\UserInterface;
use UnicaenUtilisateur\Entity\Db\UserRoleInterface;
use UnicaenUtilisateur\Provider\Identity\IdentityProviderAwareTrait;

class IdentityService
@@ -31,7 +32,9 @@ class IdentityService
            }
        }

        return array_merge($roles, $rolesAuto);
        /** array_unique() : un même rôle peut provenir de la table des rôles des utilisateurs (@see UserRoleInterface)
         et du calcul des rôles automatiques */
        return array_unique(array_merge($roles, $rolesAuto));
    }

    /**
@@ -54,6 +57,8 @@ class IdentityService
            }
        }

        return array_merge($users, $usersAuto);
        /** array_unique() : un même utilisateur peut provenir de la table des rôles des utilisateurs (@see UserRoleInterface)
        et du calcul des rôles automatiques */
        return array_unique(array_merge($users, $usersAuto));
    }
}
 No newline at end of file
+66 −1
Changes for src/UnicaenUtilisateur/Service/User/UserService.php: 66 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ use UnicaenUtilisateur\Exception\RuntimeException;
use UnicaenUtilisateur\Service\CommonService;
use UnicaenUtilisateur\Service\RechercheIndividu\RechercheIndividuResultatInterface;
use UnicaenUtilisateur\Service\RechercheIndividu\RechercheIndividuServiceInterface;
use Zend\Authentication\AuthenticationService;
use Zend\Crypt\Password\Bcrypt;
use Zend\Mvc\Controller\AbstractActionController;

@@ -27,6 +28,11 @@ class UserService extends CommonService implements RechercheIndividuServiceInter
     */
    protected $userRolePerimetreEntityClass;

    /**
     * @var AuthenticationService
     */
    private $authenticationService;


    /**
     * @param string $userEntityClass
@@ -67,6 +73,15 @@ class UserService extends CommonService implements RechercheIndividuServiceInter
        $this->userRolePerimetreEntityClass = $userRolePerimetreEntityClass;
    }

    /**
     * @param AuthenticationService $authenticationService
     * @return void
     */
    public function setAuthenticationService(AuthenticationService $authenticationService)
    {
        $this->authenticationService = $authenticationService;
    }

    /**
     * @return UserInterface[]
     */
@@ -153,6 +168,49 @@ class UserService extends CommonService implements RechercheIndividuServiceInter
        return $user;
    }

    /**
     * @return UserInterface
     */
    public function getConnectedUser()
    {
        $identity = $this->authenticationService->getIdentity();

        if ($identity) {
            $username = null;
            if (isset($identity['ldap'])) {
                /** @var People $userIdentity */
                $userIdentity = $identity['ldap'];
                $username = $userIdentity->getSupannAliasLogin();
                $user = $this->findByUsername($username);

                return $user;
            }
            if (isset($identity['shib'])) {
                /** @var People $userIdentity */
                $userIdentity = $identity['shib'];
                $username = $userIdentity->getUsername();
                $user = $this->findByUsername($username);

                return $user;
            }
            if (isset($identity['db'])) {
                return $identity['db'];
            }
        }

        return null;
    }

    /**
     * @return \Zend\Permissions\Acl\Role\RoleInterface|null
     */
    public function getConnectedRole()
    {
        $dbRole = $this->serviceUserContext->getSelectedIdentityRole();

        return $dbRole;
    }

    /**
     * @param UserInterface $utilisateur
     * @return UserInterface
@@ -283,6 +341,13 @@ class UserService extends CommonService implements RechercheIndividuServiceInter
    public function addPerimetre(UserInterface $utilisateur, RoleInterface $role, PerimetreInterface $perimetre)
    {
        $userRole = $utilisateur->getFullRole($role);
        if(null == $userRole) {
            /** @var UserRoleInterface $userRole */
            $userRole = new $this->userRoleEntityClass;
            $userRole ->setRole($role)
                      ->setUser($utilisateur);
            $this->getEntityManager()->persist($userRole);
        }

        /** @var UserRolePerimetreInterface $entity */
        $entity = new $this->userRolePerimetreEntityClass;
@@ -291,7 +356,7 @@ class UserService extends CommonService implements RechercheIndividuServiceInter

        try {
            $this->getEntityManager()->persist($entity);
            $this->getEntityManager()->flush($entity);
            $this->getEntityManager()->flush();
        } catch (\Exception $e) {
            throw new RuntimeException("Un problème est survenu lors de l'ajout du périmètre \"" . $perimetre->getLibelle() . "\" à l'utilisateur " . $utilisateur->getUsername() . ".", null, $e);
        }
+4 −1
Changes for src/UnicaenUtilisateur/Service/User/UserServiceFactory.php: 4 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ use Doctrine\ORM\EntityManager;
use Interop\Container\ContainerInterface;
use UnicaenAuthentification\Service\UserContext;
use UnicaenUtilisateur\Entity\Db\User;
use Zend\Authentication\AuthenticationService;


class UserServiceFactory
@@ -22,10 +23,11 @@ class UserServiceFactory
    {
        /**
         * @var EntityManager $entityManager
         * @var AuthenticationService $authenticationService
         */
        $entityManager = $container->get('Doctrine\ORM\EntityManager');
        $userContext = $container->get(UserContext::class);
        $config = $container->get('Config');
        $authenticationService = $container->get(AuthenticationService::class);

        $userEntityClass = $config['zfcuser']['user_entity_class'] ?? User::class;
        $mapping = $entityManager->getClassMetadata($userEntityClass)->getAssociationMapping('roles');
@@ -36,6 +38,7 @@ class UserServiceFactory

        $service = new UserService();
        $service->setEntityManager($entityManager);
        $service->setAuthenticationService($authenticationService);
        $service->setEntityClass($userEntityClass);
        $service->setUserRoleEntityClass($userRoleEntityClass);
        $service->setUserRolePerimetreEntityClass($userRolePerimetreEntityClass);
+6 −1
Changes for src/UnicaenUtilisateur/View/Helper/UserRole.php: 6 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -74,14 +74,19 @@ class UserRole extends AbstractHelper
     */
    public function renderPerimetreStatut(RoleInterface $role, PerimetreInterface $perimetre)
    {
        $statut = false;
        $categorie = $perimetre->getCategorie();
        $userRolePerimetres = $this->user->getFullRole($role)->getPerimetres();
        $userRole = $this->user->getFullRole($role);

        if(null !== $userRole) { // rôle manuel
            $userRolePerimetres = $userRole->getPerimetres();
            $userPerimetres = $userRolePerimetres->filter(function ($p) use ($categorie) {
                return $p->getPerimetre()->getCategorie()->getCode() === $categorie->getCode();
            });
            $statut = $userPerimetres->exists(function ($k, $p) use ($perimetre) {
                return $p->getPerimetre()->getCode() === $perimetre->getCode();
            });
        }

        $html = sprintf('
            <div class="checkbox">
+1 −1
Changes for view/unicaen-utilisateur/role/index.phtml: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -100,7 +100,7 @@ $canEffacer = $this->isAllowed(RolePrivileges::getResourceId(RolePrivileges:
                            <?php endif; ?>
                        <?php else: ?>
                            <a href="#" data-toggle="popover" data-placement="left" data-html="true" data-content="<?php echo implode("<br />", $users); ?>">
                                <i class="fas fa-user"></i> <?php echo $role->getPerimetreCategories()->count(); ?>
                                <i class="fas fa-user"></i> <?php echo count($users); ?>
                            </a>
                        <?php endif; ?>
                    </td>