. */ declare(strict_types=1); namespace App\Security\Voter; use App\Entity\UserSystem\User; use App\Services\UserSystem\VoterHelper; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; use Symfony\Component\Security\Core\User\UserInterface; /** * This voter implements a virtual role, which can be used if the user has any permission set to allowed. * We use this to restrict access to the homepage. * @phpstan-extends Voter */ final class ImpersonateUserVoter extends Voter { public function __construct(private readonly VoterHelper $helper) { } protected function supports(string $attribute, mixed $subject): bool { return $attribute === 'CAN_SWITCH_USER' && $subject instanceof UserInterface; } protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token, ?Vote $vote = null): bool { $result = $this->helper->isGranted($token, 'users', 'impersonate'); if ($result === false) { $vote?->addReason('User is not allowed to impersonate other users.'); $this->helper->addReason($vote, 'users', 'impersonate'); } return $result; } public function supportsAttribute(string $attribute): bool { return $attribute === 'CAN_SWITCH_USER'; } public function supportsType(string $subjectType): bool { return is_a($subjectType, User::class, true); } }