<?php
namespace App\Security;
use App\Repository\UtilisateurRepository;
use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthUser;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
class EntraRoleVoter implements VoterInterface
{
public function __construct(private UtilisateurRepository $utilisateurRepository)
{
}
public function vote(TokenInterface $token, mixed $subject, array $attributes): int
{
$user = $token->getUser();
if (!$user instanceof OAuthUser) {
return self::ACCESS_ABSTAIN;
}
$email = $user->getUserIdentifier();
$login = strtolower(explode('@', $email)[0]);
$realUser = $this->utilisateurRepository->findOneBy(['login' => $login]);
if (!$realUser) {
return self::ACCESS_ABSTAIN;
}
$realRoles = $realUser->getRoles();
foreach ($attributes as $attribute) {
if ($attribute === 'IS_AUTHENTICATED_REMEMBERED' || in_array($attribute, $realRoles, true)) {
return self::ACCESS_GRANTED;
}
}
return self::ACCESS_ABSTAIN;
}
}