<?php
namespace App\Security\Voter;
use App\Entity\User;
use App\Repository\UserAccessRepository;
use App\twig\AppFunction;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
class AccessVoter extends Voter
{
// Définir les attributs/permissions
const EDIT = 'society_edit';
const SHOW = 'society_show';
const VIEW_PERMISSIONS = 'view_permissions';
private $security;
private $userAccessRepo;
public function __construct(Security $security, UserAccessRepository $userAccessRepo )
{
$this->security = $security;
$this->userAccessRepo = $userAccessRepo;
}
protected function supports(string $attribute, $subject): bool
{
// Le voter ne supporte que les permissions d'édition, de visualisation et d'accès aux permissions
return in_array($attribute, [self::EDIT, self::SHOW, self::VIEW_PERMISSIONS])
&& $subject instanceof User;
}
protected function onKrenelrequest()
{
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
$user = $token->getUser();
// Si l'utilisateur n'est pas connecté, refuser l'accès
if (!$user instanceof User) {
return false;
}
// Si l'utilisateur a un rôle d'administrateur, accorder l'accès
if ($this->security->isGranted('ROLE_ADMIN')) {
return true;
}
// Vérifier les permissions spécifiques
switch ($attribute) {
case self::EDIT:
case self::SHOW:
return $this->hasPermission($user, $attribute);
case self::VIEW_PERMISSIONS:
// L'utilisateur peut voir ses propres permissions ou un administrateur peut voir les permissions des autres
return $user === $subject || $this->security->isGranted('ROLE_ADMIN');
}
return false;
}
// private function hasPermission(User $user, string $attribute): bool
// {
// // Logique pour vérifier si l'utilisateur a la permission (exemple simplifié)
// return in_array($attribute, $user->getPermissions());
// }
private function hasPermission(User $user, string $attribute): bool
{
// Récupérer les permissions stockées en base pour cet utilisateur via l'entité UserAccess
$userAccess = $this->userAccessRepo->findOneBy(['user' => $user->getId()]);
if (!$userAccess) {
// Si l'utilisateur n'a pas de permissions associées, refuser l'accès
return false;
}
// Vérifier si l'attribut (la permission demandée) fait partie des permissions de l'utilisateur
return in_array($attribute, $userAccess->getPermission());
}
}