<?php
namespace App\Security\Voter;
use App\Entity\Emplacement;
use App\Entity\User;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
class EmplacementVoter extends Voter
{
public const EDIT = 'EMPLACEMENT_EDIT';
public const VIEW = 'EMPLACEMENT_VIEW';
public const DELETE = 'EMPLACEMENT_DELETE';
public const CREATE = 'EMPLACEMENT_CREATE';
public function __construct(private Security $security)
{}
protected function supports(string $attribute, $emplacement): bool
{
// replace with your own logic
// https://symfony.com/doc/current/security/voters.html
return in_array($attribute, [self::EDIT, self::VIEW, self::DELETE, self::CREATE])
&& $emplacement instanceof \App\Entity\Emplacement;
}
protected function voteOnAttribute(string $attribute, $emplacement, TokenInterface $token): bool
{
$user = $token->getUser();
// if the user is anonymous, do not grant access
if (!$user instanceof UserInterface) {
return false;
}
//On vérifie si l'utilisateur est admin
if($this->security->isGranted('ROLE_ADMIN'))
{
return true;
}
// ... (check conditions and return true to grant permission) ...
switch ($attribute) {
case self::EDIT:
// on vérifie si on peut éditer
return $this->canEdit($emplacement, $user);
break;
case self::VIEW:
// on vérifie si on peut visualiser
return $this->canView($emplacement, $user);
break;
case self::DELETE:
// on vérifie si on peut supprimer
return $this->canDelete($emplacement, $user);
break;
case self::CREATE:
// on vérifie si on peut créer
return $this->canCreate($emplacement, $user);
break;
}
return false;
}
private function canEdit(Emplacement $emplacement, User $user){
// Le compte qui a accès à cet emplacement et qui a le ROLE_EMPLACEMENT peut modifier cet emplacement
if($this->security->isGranted('ROLE_FOODTRUCK') OR $this->security->isGranted('ROLE_EMPLACEMENT'))
{
return ($user === $emplacement->getCreateur());
// foreach ($user->getAccesEmplacements() as $key => $accesEmplacement) {
// if($accesEmplacement->getEmplacement() === $emplacement){
// return true;
// }
// }
}
}
private function canView(Emplacement $emplacement, User $user){
// Le compte qui a accès à cet emplacement peut le visualiser
foreach ($user->getAccesEmplacements() as $key => $accesEmplacement) {
if($accesEmplacement->getEmplacement() === $emplacement){
return true;
}
}
}
private function canDelete(Emplacement $emplacement, User $user){
// Seul l'admin peut supprimer un emplacement
// Le compte qui a accès à un emplacement peut seulement supprimer son accès
}
private function canCreate(Emplacement $emplacement, User $user){
// Le ROLE_FOODTRUCK peut créer un emplacement
// Le ROLE_EMPLACEMENT peut créer un emplacement
if($this->security->isGranted('ROLE_FOODTRUCK') OR $this->security->isGranted('ROLE_EMPLACEMENT'))
{
return true;
}
}
}