<?php
namespace App\Security;
use App\Annotations\HasPermission;
use App\Annotations\PermissionKey;
use App\Entity\Menu;
use App\Entity\Security\Permission;
use App\Entity\User\User;
use App\Manager\User\PermissionManager;
use Doctrine\Common\Annotations\Reader;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
class EntityVoter extends Voter
{
private RequestStack $requestStack;
private PermissionManager $manager;
public function __construct(RequestStack $requestStack, PermissionManager $manager)
{
$this->requestStack = $requestStack;
$this->manager = $manager;
}
/**
* @inheritDoc
*/
protected function supports($attribute, $subject): bool
{
// We check permission for all routes
return true;
}
/**
* @inheritDoc
*/
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
/** @var User $user */
$user = $token->getUser();
if (!$user instanceof User)
{
return false;
}
try {
$method = new \ReflectionMethod($this->requestStack->getCurrentRequest()->get('_controller'));
} catch (\ReflectionException $e) {
return false;
}
return $this->manager->hasPermission(null, $method);
}
}