src/Security/Voter/FolderVoter.php line 15

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Folder;
  4. use App\Entity\Group;
  5. use App\Entity\User;
  6. use App\Repository\UserRepository;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  9. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  10. use Symfony\Component\Security\Core\User\UserInterface;
  11. class FolderVoter extends Voter
  12. {
  13.     // these strings are just invented: you can use anything
  14.     const CREATE 'create';
  15.     const VIEW 'view';
  16.     const EDIT 'edit';
  17.     const DELETE 'delete';
  18.     private $em;
  19.     private $userRepository;
  20.     /**
  21.      * FolderVoter constructor.
  22.      * @param EntityManagerInterface $entityManager
  23.      * @param UserRepository $userRepository
  24.      */
  25.     public function __construct(EntityManagerInterface $entityManager,UserRepository $userRepository){
  26.         $this->em $entityManager;
  27.         $this->userRepository $userRepository;
  28.     }
  29.     protected function supports($attribute$subject)
  30.     {
  31.         // replace with your own logic
  32.         // https://symfony.com/doc/current/security/voters.html
  33.         return in_array($attribute, [self::CREATE,self::VIEW,self::EDIT,self::DELETE])
  34.             && $subject instanceof Folder;
  35.     }
  36.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  37.     {
  38.         $user $token->getUser();
  39.         // if the user is anonymous, do not grant access
  40.         if (!$user instanceof UserInterface) {
  41.             return false;
  42.         }
  43.         /** @var User $user */
  44.         $user $this->userRepository->findOneBy(['email' => $user->getUsername()]);
  45.         /** @var Folder $folder*/
  46.         $folder $subject;
  47.         // ... (check conditions and return true to grant permission) ...
  48.         switch ($attribute) {
  49.             case self::VIEW:
  50.                 // logic to determine if the user can VIEW
  51.                 return $this->canView($folder,$user);
  52.                 break;
  53.         }
  54.         return false;
  55.     }
  56.     private function canView(Folder $folderUser $user)
  57.     {
  58.         /** @var Group $groupUser*/
  59.         foreach ($user->getGroups() as $groupUser){
  60.             foreach ($folder->getGroups() as $groupFolder){
  61.                 if($groupUser->getId() === $groupFolder->getId()){
  62.                     return true;
  63.                 }
  64.             }
  65.         }
  66.          return false;
  67.     }
  68. }