<?php
namespace App\Security\Voter;
use App\Service\HierarchyService;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class UserVoter extends Voter
{
public const EDIT = 'PATCH_USER';
public const DELETE = 'DELETE_USER';
private $hierarchyService;
public function __construct(
HierarchyService $hierarchyService
)
{
$this->hierarchyService = $hierarchyService;
}
protected function supports(string $attribute, $subject): bool
{
// replace with your own logic
// https://symfony.com/doc/current/security/voters.html
return in_array($attribute, [self::EDIT,self::DELETE])
&& $subject instanceof \App\Entity\User;
}
protected function voteOnAttribute(string $attribute, $user, TokenInterface $token): bool
{
$userConnected = $token->getUser();
// si l'utilisateur est anonyme, ne pas accorder l'accès
if (!$userConnected instanceof UserInterface) {
return false;
}
// ... (vérifier les conditions et renvoyer true pour accorder l'autorisation) ...
switch ($attribute) {
case self::EDIT:
// logique pour déterminer si l'utilisateur connecté peut modifier l'utilisateur cible
// return true or false
if($user == $userConnected || $this->hierarchyService->isChild($userConnected, $user)){
return true;
}
break;
case self::DELETE:
// logique pour déterminer si l'utilisateur connecté peut modifier l'utilisateur cible
// return true or false
if($user == $userConnected || $this->hierarchyService->isChild($userConnected, $user)){
return true;
}
break;
}
return false;
}
}