src/Security/Voter/PersonVoter.php line 23

Open in your IDE?
  1. <?php
  2. /*
  3.  * To change this license header, choose License Headers in Project Properties.
  4.  * To change this template file, choose Tools | Templates
  5.  * and open the template in the editor.
  6.  */
  7. namespace App\Security\Voter;
  8. use App\Entity\JIT\Person;
  9. use App\Entity\Security\User;
  10. use LogicException;
  11. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  12. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  13. use Symfony\Component\Security\Core\Security;
  14. /**
  15.  * Description of PersonVoter
  16.  *
  17.  * @author NOUTCHEU Blaise
  18.  */
  19. class PersonVoter extends Voter {
  20.     // these strings are just invented: you can use anything
  21.     const LISTE 'ROLE_JIT_PERSON_INDEXE';
  22.     const LISTP 'ROLE_JIT_PERSON_INDEXP';
  23.     const LISTL 'ROLE_JIT_PERSON_INDEXL';
  24.     const LISTD 'ROLE_JIT_PERSON_INDEXD';
  25.     const LIST = 'ROLE_JIT_PERSON_INDEX';
  26.     const ADD 'ROLE_JIT_PERSON_ADD';
  27.     const ADDE 'ROLE_JIT_PERSON_ADDE';
  28.     const ADDP 'ROLE_JIT_PERSON_ADDP';
  29.     const ADDL 'ROLE_JIT_PERSON_ADDL';
  30.     const ADDD 'ROLE_JIT_PERSON_ADDD';
  31.     const VIEW 'ROLE_JIT_PERSON_VIEW';
  32.     const VIEWE 'ROLE_JIT_PERSON_VIEWE';
  33.     const VIEWP 'ROLE_JIT_PERSON_VIEWP';
  34.     const VIEWL 'ROLE_JIT_PERSON_VIEWL';
  35.     const VIEWD 'ROLE_JIT_PERSON_VIEWD';
  36.     const CLONE = 'ROLE_JIT_PERSON_CLONE';
  37.     const EDIT 'ROLE_JIT_PERSON_EDIT';
  38.     const DELETE 'ROLE_JIT_PERSON_DELETE';
  39.     const EDIT_ACCOUNT 'ROLE_JIT_PERSON_EDIT_ACCOUNT';
  40.     private $security;
  41.     public function __construct(Security $security) {
  42.         $this->security $security;
  43.     }
  44.     protected function supports(string $attribute$subject) {
  45.         if (in_array($attribute, [
  46.                     self::LISTE,
  47.                     self::LISTP,
  48.                     self::LISTL,
  49.                     self::LISTD,
  50.                     self::LIST,
  51.                     self::ADD,
  52.                     self::ADDE,
  53.                     self::ADDP,
  54.                     self::ADDL,
  55.                     self::ADDD,
  56.                     self::VIEW,
  57.                     self::VIEWD,
  58.                     self::VIEWE,
  59.                     self::VIEWL,
  60.                     self::VIEWP,
  61.                     self::CLONE,
  62.                     self::EDIT,
  63.                     self::DELETE,
  64.                     self::EDIT_ACCOUNT,
  65.                 ])) {
  66.             return true;
  67.         }
  68.         if (!in_array($attribute, [
  69.                     self::VIEW,
  70.                 ])) {
  71.             return false;
  72.         }
  73.         // only vote on `Person` objects
  74.         if (!$subject instanceof Person) {
  75.             return false;
  76.         }
  77.         return true;
  78.     }
  79.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token) {
  80.         $user $token->getUser();
  81.         if (!$user instanceof User) {
  82.             // the user must be logged in; if not, deny access
  83.             return false;
  84.         }
  85.         // ROLE_JIT_PERSON_MANAGE can do anything on person! The power!
  86.         if ($this->security->isGranted('ROLE_DEV')) {
  87.             return true;
  88.         }
  89.         switch ($attribute) {
  90.             case self::LIST:
  91.                 return false;
  92.             case self::LISTE:
  93.             case self::LISTD:
  94.             case self::LISTL:
  95.             case self::LISTP:
  96.                 return $this->canList($user);
  97.             case self::VIEW:
  98.             case self::VIEWE:
  99.             case self::VIEWD:
  100.             case self::VIEWL:
  101.             case self::VIEWP:
  102.                 return $subject!== null && $this->canView($subject$user);
  103.             case self::ADD:
  104.                 return false;
  105.             case self::ADDE:
  106.                 return $this->canAddE($user);
  107.             case self::ADDP:
  108.                 return $this->canAddP($user);
  109.             case self::ADDL:
  110.                 return $this->canAddL($user);
  111.             case self::ADDD:
  112.                 return $this->canAddD($user);
  113.             case self::CLONE:
  114.                 return $this->canClone($subject$user);
  115.             case self::EDIT:
  116.                 return $this->canEdit($subject$user);
  117.             case self::DELETE:
  118.                 return $this->canDelete($subject$user);
  119.             case self::EDIT_ACCOUNT:
  120.                 return $this->canEditAccount($subject$user);
  121.         }
  122.         throw new LogicException('This code should not be reached!');
  123.     }
  124.     private function canList(User $user) {
  125.         return true;
  126.     }
  127.     private function canView(Person $personUser $user) {
  128.         //Vérifier si c'est lié à une personne (ie person null)
  129. //        if($person == null){
  130. //            return false;
  131. //        }
  132.         // vérifier que c'est une person de l'utilisateur connecté
  133.         if ($user->getPersons()->contains($person)) {
  134.             return true;
  135.         }
  136.         // vérifier que c'est un employé de l'utilisateur connecté
  137.         if ($user->getMyEmployees()->contains($person)) {
  138.             return true;
  139.         }
  140.         // vérifier que c'est un propriétaire de l'utilisateur connecté
  141.         if ($user->getMyAOwners()->contains($person)) {
  142.             return true;
  143.         }
  144.         // vérifier que c'est un locataire de l'utilisateur connecté
  145.         if ($user->getMyATenants()->contains($person)) {
  146.             return true;
  147.         }
  148.         return false;
  149.     }
  150.     private function canAddE(User $user) {
  151.         if ($user->hasAgency()) {
  152.             return true;
  153.         }
  154.         return false;
  155.     }
  156.     private function canAddP(User $user) {
  157.         if ($user->isEmployee()) {
  158.             return true;
  159.         }
  160.         return false;
  161.     }
  162.     private function canAddL(User $user) {
  163.         if ($user->isEmployee()) {
  164.             return true;
  165.         }
  166.         return false;
  167.     }
  168.     private function canAddD(User $user) {
  169.         if ($user->isEmployee()) {
  170.             return true;
  171.         }
  172.         return false;
  173.     }
  174.     private function canClone(Person $personUser $user) {
  175.         //Uniquement le chef d'agence peut modifier une personne
  176.         if ($this->canView($person$user)) {
  177.             if ($person->isOwner()) {
  178.                 return $this->canAddP($user);
  179.             } else if ($person->isLocataire()) {
  180.                 return $this->canAddL($user);
  181.             } else if ($person->isDemarcheur()) {
  182.                 return $this->canAddD($user);
  183.             } else if ($person->isEmployee()) {
  184.                 return $this->canAddE($user);
  185.             }
  186.         }
  187.         return false;
  188.     }
  189.     private function canEdit(Person $personUser $user) {
  190.         //Uniquement le chef d'agence peut modifier une personne
  191.         if ($user->getMyAgencies()->contains($person->getAgency())) {
  192.             return true;
  193.         }
  194.         return false;
  195.     }
  196.     private function canDelete(Person $personUser $user) {
  197.         //Uniquement le chef d'agence peut modifier une personne
  198.         if ($user->getMyAgencies()->contains($person->getAgency())) {
  199.             return true;
  200.         }
  201.         return false;
  202.     }
  203.     private function canEditAccount(Person $personUser $user) {
  204.         if (!$this->security->isGranted('ROLE_SECURITY_USER_LIST_ALL')) {
  205.             return false;
  206.         }
  207.         if ($user->getMyAgencies()->contains($person->getAgency())) {
  208.             return true;
  209.         }
  210.         return false;
  211.     }
  212. }