src/Security/IcoVoter.php line 19

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\MajDossier;
  4. use App\Entity\PracticalFile;
  5. use App\Entity\User;
  6. use App\Service\UserManager;
  7. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  8. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  9. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  10. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  11. /**
  12.  * Voter pour l'article et fiche Pratique
  13.  *
  14.  * @author Ismail mezrani <[email protected]>
  15.  */
  16. class IcoVoter extends Voter
  17. {
  18.     const APP_PERMISSION_PREFIX 'ICO_';
  19.     /**
  20.      * Cache facultatif des permissions (la session de l'utilisateur courant par défaut)
  21.      *
  22.      * @var \Symfony\Component\HttpFoundation\Session\Session
  23.      */
  24.     protected $session;
  25.     /**
  26.      * Manager des utilisateurs
  27.      * @var \App\Service\UserManager
  28.      */
  29.     protected $userManager;
  30.     /**
  31.      * @var AuthorizationCheckerInterface
  32.      */
  33.     protected $authorizationChecker;
  34.     /**
  35.      * Constructeur du voteur
  36.      *
  37.      * @param UserManager $userManager Manager des utilisateurs
  38.      * @param mixed $session Session
  39.      */
  40.     public function __construct(UserManager $userManagerSessionInterface $sessionAuthorizationCheckerInterface $authorizationChecker)
  41.     {
  42.         $this->userManager $userManager;
  43.         $this->session $session;
  44.         $this->authorizationChecker $authorizationChecker;
  45.     }
  46.     /**
  47.      * @inheritdoc
  48.      */
  49.     protected function supports($attribute$subject)
  50.     {
  51.         return === strpos($attributeself::APP_PERMISSION_PREFIX);
  52.     }
  53.     /**
  54.      * @inheritdoc
  55.      */
  56.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  57.     {
  58.         $user $token->getUser();
  59.         if (!$user instanceof User) {
  60.             return false;
  61.         }
  62.         if ($user->isAdmin()) {
  63.             return true;
  64.         }
  65.         switch ($attribute) {
  66.             case 'ICO_IMPORT_WORD_EZP':
  67.                 $can $this->canImportWordEzp($user$attribute$subject);
  68.                 break;
  69.             case 'ICO_DOWNLOAD_MANUSCRIT_TOOLS':
  70.                 $can $this->canDownloadManuscritTools($subject);
  71.                 break;
  72.             case 'ICO_VIEW_DROPZONE':
  73.                 $can $this->canViewDropzone($subject);
  74.                 break;
  75.             default:
  76.                 $can $this->hasPermission($user$attribute);
  77.         }
  78.         return $can;
  79.     }
  80.     /**
  81.      * Si un utilisateur peut importer un manuscrit depuis EZP
  82.      * Dans le contexte d'une fiche, la fiche doit être à l'étape en ligne.
  83.      *
  84.      * @param PracticalFile|MajDossier $subject
  85.      */
  86.     protected function canImportWordEzp(User $userstring $permission$subject): bool
  87.     {
  88.         $can $this->hasPermission($user$permission);
  89.         if ($subject instanceof PracticalFile) {
  90.             $can $can && $subject->getCurrentStep()->getCode() === 'fiche_en_ligne';
  91.         }
  92.         return $can;
  93.     }
  94.     /**
  95.      * Si un utilisateur peut voir la dropzone d'upload du manuscrit et des outils
  96.      */
  97.     protected function canViewDropzone(PracticalFile $practicalFile): bool
  98.     {
  99.         $currentStepCode $practicalFile->getCurrentStep()->getCode();
  100.         return ($this->authorizationChecker->isGranted('ROLE_AUTEUR_FICHE') && $currentStepCode === 'fiche_en_ecriture')
  101.             || ($this->authorizationChecker->isGranted('ROLE_ED-COORDINATEUR') && in_array($currentStepCode, ['fiche_en_ecriture''fiche_en_validation']))
  102.             || $this->authorizationChecker->isGranted('ROLE_EDITEUR')
  103.             || $this->authorizationChecker->isGranted('ROLE_CHARGE_PUBLICATION')
  104.             || $this->authorizationChecker->isGranted('ROLE_PREPARATEUR')
  105.             ;
  106.     }
  107.     /**
  108.      * Si un utilisateur peut télécharger le manuscrit et les outils d'une fiche dans le context d'une fiche
  109.      * ou d'une maj dossier
  110.      */
  111.     protected function canDownloadManuscritTools(?PracticalFile $practicalFile null): bool
  112.     {
  113.         if (!$practicalFile) {
  114.             return $this->authorizationChecker->isGranted('ROLE_AUTEUR_FICHE')
  115.                 || $this->authorizationChecker->isGranted('ROLE_ED-COORDINATEUR')
  116.                 || $this->authorizationChecker->isGranted('ROLE_COMPOSITEUR');
  117.         } else {
  118.             $currentStepCode $practicalFile->getCurrentStep()->getCode();
  119.             return ($this->authorizationChecker->isGranted('ROLE_AUTEUR_FICHE') && $currentStepCode === 'fiche_en_ecriture')
  120.                 || ($this->authorizationChecker->isGranted('ROLE_ED-COORDINATEUR') && in_array($currentStepCode, ['fiche_en_ecriture''fiche_en_validation']))
  121.                 || ($this->authorizationChecker->isGranted('ROLE_COMPOSITEUR') && $currentStepCode === 'fiche_en_saisie');
  122.         }
  123.     }
  124.     /**
  125.      * Vérifie que l'utilisateur courant possède une autorisation
  126.      *
  127.      * @param User $user Utilisateur courant
  128.      * @param string $attribute Attribut contenant la permission à verifier sous la forme (ROLE_CODEPERMISSION)
  129.      * @return boolean
  130.      */
  131.     protected function hasPermission(User $user$attribute)
  132.     {
  133.         // On récupère les permissions de l'utilisateur courant
  134.         $userPermissions $this->session $this->session->get('user-permissions'false) : false;
  135.         if ($userPermissions === false) {
  136.             $userPermissions $this->userManager->getUserPermissions($user);
  137.             // Cache en session
  138.             if ($this->session) {
  139.                 $this->session->set('user-permissions'$userPermissions);
  140.             }
  141.         }
  142.         return in_array($attribute$userPermissions);
  143.     }
  144. }