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

Déplacement du périmètre associé à un utilisateur et un rôle dans une entité...

Déplacement du périmètre associé à un utilisateur et un rôle dans une entité spécifique "UserRolePerimetre" au lieu de "UserRole" :
- un rôle n'est défini qu'une seule fois pour un utilisateur dans l'entité "UserRole"
- possibilité de définir plusieurs périmètres pour un même rôle
parent 16101a3c
Loading
Loading
Loading
Loading
+24 −16
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ use UnicaenPrivilege\Provider\Perimetre\Rules\PerimetreRuleInterface;
use UnicaenPrivilege\Provider\Privilege\PrivilegeProviderAwareTrait;
use UnicaenUtilisateur\Entity\Db\UserInterface;
use UnicaenUtilisateur\Entity\Db\UserRoleInterface;
use UnicaenUtilisateur\Entity\Db\UserRolePerimetreInterface;
use UnicaenUtilisateur\Service\RechercheIndividu\RechercheIndividuServiceInterface;

/**
@@ -96,33 +97,36 @@ class PrivilegeController extends Controller
                $rulePerimetres = (array)$rule['perimetres'];
                // parcours de toutes les périmètres (catégories)
                foreach ($perimetresRoles as $perimetreCateg => $pr) {
                    /** vérification que le périmètre a un service implémentant @see PerimetreRuleInterface associé dans la config */
                    if(array_key_exists($perimetreCateg, $this->perimetresRules)) {
                        // vérification que le périmètre est appelé dans la règle
                        if (in_array($perimetreCateg, $rulePerimetres)) {
                            /** @var PerimetreRuleInterface $service */
                            $service = $this->perimetresRules[$perimetreCateg];
                            // parcours des rôles autorisés pour la règle
                            foreach ($rule['roles'] as $role) {
                                // vérification que le rôle fait partie des rôles associés au périmètre
                                if (in_array($role, $pr)) {
                                // récupération des droits de l'utilisateur pour le rôle et le périmètre
                                $userExactRole = $user->getFullRoles()->filter(function ($r) use ($role, $perimetreCateg) {
                                    $userRoles = $user->getFullRoles()->filter(function ($r) use ($role) {
                                        /** @var UserRoleInterface $r */
                                    $pc = $r->getPerimetreCategorie();
                                    return $r->getRole()->getRoleId() === $role && ($pc ? $pc->getCode() : null) === $perimetreCateg;
                                        return $r->getRole()->getRoleId() === $role;
                                    });
                                // si une règle existe
                                if($userExactRole->count() === 1) {
                                    $ur = $userExactRole->current();
                                    /** vérification que le périmètre a un service implémentant @see PerimetreRuleInterface associé dans la config */
                                    if(array_key_exists($perimetreCateg, $this->perimetresRules)) {
                                        /** @var PerimetreRuleInterface $service */
                                        $service = $this->perimetresRules[$perimetreCateg];

                                    // si l'utilisateur possède ce rôle
                                    if ($userRoles->count() === 1) {
                                        // récupération des droits de l'utilisateur pour le rôle et le périmètre
                                        $userPerimetres = $userRoles->current()->getPerimetres()->filter(function($p) use ($perimetreCateg) {
                                            /** @var UserRolePerimetreInterface $p */
                                            return $p->getPerimetreCategorie()->getCode() == $perimetreCateg;
                                        });

                                        /** @var UserRolePerimetreInterface $up */
                                        foreach($userPerimetres as $up) {
                                            // vérification de la règle
                                        if($service->checkRule($ur->getPerimetre())) {
                                            continue;
                                            if ($service->checkRule($up->getPerimetre())) {
                                                continue 2;
                                            }
                                        }
                                    else {
                                        throw new RuntimeException(sprintf('Le périmètre "%s" n\'a aucun service associé défini dans la configuration : "unicaen-perimetre" > "rule_providers"', $perimetreCateg));
                                    }
                                    }

                                    // suppression du rôle des rôles autorisés pour cette règle
@@ -132,6 +136,10 @@ class PrivilegeController extends Controller
                            }
                        }
                    }
                    else {
                        throw new RuntimeException(sprintf('Le périmètre "%s" utilisé dans vos droits n\'a aucun service associé dans la configuration : "unicaen-perimetre" > "rule_providers"', $perimetreCateg));
                    }
                }

                unset($rule['perimetres']);
                if (0 < count($rule['roles'])) {