src/Security/EntityVoter.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\Menu;
  4. use App\Entity\Permission;
  5. use App\Entity\Profile;
  6. use App\Entity\User;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Sogec\BOBundle\Routing\CRUDAction;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  11. /**
  12.  * Class EntityVoter.
  13.  */
  14. class EntityVoter extends Voter
  15. {
  16.     /**
  17.      * @var EntityManagerInterface
  18.      */
  19.     private $manager;
  20.     /**
  21.      * EntityVoter constructor.
  22.      *
  23.      * @param EntityManagerInterface $manager Entity manager.
  24.      */
  25.     public function __construct(EntityManagerInterface $manager)
  26.     {
  27.         $this->manager $manager;
  28.     }
  29.     /**
  30.      * {@inheritdoc}
  31.      */
  32.     protected function supports($action$route)
  33.     {
  34.         // if the attribute isn't one we support, return false
  35.         if (!in_array($action, array(CRUDAction::SHOWCRUDAction::EDITCRUDAction::DELETECRUDAction::NEW))) {
  36.             return false;
  37.         }
  38.         return true;
  39.     }
  40.     /**
  41.      * @param string         $action
  42.      * @param mixed          $route
  43.      * @param TokenInterface $token
  44.      *
  45.      * @return bool
  46.      */
  47.     protected function voteOnAttribute($action$routeTokenInterface $token)
  48.     {
  49.         $user $token->getUser();
  50.         if (!$user instanceof User) {
  51.             // the user must be logged in; if not, deny access
  52.             return false;
  53.         }
  54.         return $this->canActionByProfile($user$route$action);
  55.     }
  56.     /**
  57.      * @param User   $user
  58.      * @param string $route
  59.      * @param string $action
  60.      *
  61.      * @return bool
  62.      */
  63.     private function canActionByProfile(User $user$route$action)
  64.     {
  65.         $profile $user->getProfile();
  66.         $permission $this->getPermissionByOption($profile$route);
  67.         if (!$permission) {
  68.             return false;
  69.         }
  70.         if ('ROLE_SUPER_ADMIN' === $user->getRoles()[0]) {
  71.             return true;
  72.         }
  73.         return === (int) $permission->getActions()[$action] ? true false;
  74.     }
  75.     /**
  76.      * @param Profile $profile
  77.      * @param string  $route
  78.      *
  79.      * @return Permission|bool|null|object
  80.      */
  81.     private function getPermissionByOption(Profile $profile$route)
  82.     {
  83.         $menu $this->manager->getRepository(Menu::class)
  84.             ->findOneBy(['route' => $route]);
  85.         $permission $this->manager->getRepository(Permission::class)
  86.             ->findOneBy(['menu' => $menu'profile' => $profile]);
  87.         return $permission $permission false;
  88.     }
  89. }