<?php
namespace App\Backoffice\Security;
use App\Backoffice\Enum\BackofficeFeatureAccessEnum;
use AppBundle\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class BackofficeFeatureVoter extends Voter
{
private EntityManagerInterface $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
protected function supports($attribute, $subject): bool
{
return \in_array($attribute, BackofficeFeatureAccessEnum::getChoices(), true);
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
$user = $token->getUser();
if ($token instanceof SwitchUserToken) {
$user = $token->getOriginalToken()->getUser();
}
if (!$user instanceof User) {
return false;
}
// User hasn't data during a switch
$user = $this->em->getRepository(User::class)->find($user->getId());
if ($user === null || $user->getBackofficeProfile() === null) {
return false;
}
return $user->getBackofficeProfile()->hasRole($attribute);
}
}