src/Security/Voter/AccessVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\User;
  4. use App\Repository\UserAccessRepository;
  5. use App\twig\AppFunction;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. use Symfony\Component\Security\Core\Security;
  9. class AccessVoter extends Voter
  10. {
  11.     // Définir les attributs/permissions
  12.     const EDIT 'society_edit';
  13.     const SHOW 'society_show';
  14.     const VIEW_PERMISSIONS 'view_permissions';
  15.     private $security;
  16.     private $userAccessRepo;
  17.     public function __construct(Security $securityUserAccessRepository $userAccessRepo )
  18.     {
  19.         $this->security $security;
  20.         $this->userAccessRepo $userAccessRepo;
  21.     }
  22.     protected function supports(string $attribute$subject): bool
  23.     {
  24.         // Le voter ne supporte que les permissions d'édition, de visualisation et d'accès aux permissions
  25.         return in_array($attribute, [self::EDITself::SHOWself::VIEW_PERMISSIONS])
  26.             && $subject instanceof User;
  27.     }
  28.     protected function onKrenelrequest()
  29.     {
  30.     }
  31.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token): bool
  32.     {
  33.         $user $token->getUser();
  34.         // Si l'utilisateur n'est pas connecté, refuser l'accès
  35.         if (!$user instanceof User) {
  36.             return false;
  37.         }
  38.         // Si l'utilisateur a un rôle d'administrateur, accorder l'accès
  39.         if ($this->security->isGranted('ROLE_ADMIN')) {
  40.             return true;
  41.         }
  42.         // Vérifier les permissions spécifiques
  43.         switch ($attribute) {
  44.             case self::EDIT:
  45.             case self::SHOW:
  46.                 return $this->hasPermission($user$attribute);
  47.             case self::VIEW_PERMISSIONS:
  48.                 // L'utilisateur peut voir ses propres permissions ou un administrateur peut voir les permissions des autres
  49.                 return $user === $subject || $this->security->isGranted('ROLE_ADMIN');
  50.         }
  51.         return false;
  52.     }
  53. //    private function hasPermission(User $user, string $attribute): bool
  54. //    {
  55. //        // Logique pour vérifier si l'utilisateur a la permission (exemple simplifié)
  56. //        return in_array($attribute, $user->getPermissions());
  57. //    }
  58.     private function hasPermission(User $userstring $attribute): bool
  59.     {
  60.         // Récupérer les permissions stockées en base pour cet utilisateur via l'entité UserAccess
  61.         $userAccess $this->userAccessRepo->findOneBy(['user' => $user->getId()]);
  62.         if (!$userAccess) {
  63.             // Si l'utilisateur n'a pas de permissions associées, refuser l'accès
  64.             return false;
  65.         }
  66.         // Vérifier si l'attribut (la permission demandée) fait partie des permissions de l'utilisateur
  67.         return in_array($attribute$userAccess->getPermission());
  68.     }
  69. }