<?php
namespace App\Security\Voter;
use App\Entity\User;
use App\Repository\PermissionRepository;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
class PermissionVoter extends Voter
{
public const VIEW = 'VIEW';
public const ADD = 'ADD';
public const EDIT = 'EDIT';
public const DELETE = 'DELETE';
public const SUPER_ADMIN = 'SUPER_ADMIN';
private $security;
private $permissionRepository;
public function __construct(Security $security, PermissionRepository $permissionRepository)
{
$this->security = $security;
$this->permissionRepository = $permissionRepository;
}
protected function supports(string $attribute, $subject): bool
{
// if the attribute isn't one we support, return false
if (!in_array($attribute, [self::VIEW, self::ADD, self::EDIT, self::DELETE, self::SUPER_ADMIN]))
{
return false;
}
if (!is_string($subject))
{
return false;
}
return true;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
/** @var User $user */
$user = $token->getUser();
// if the user is anonymous, do not grant access
if (!$user instanceof UserInterface) {
return false;
}
$roles = [];
$permissions = [];
foreach ($user->getProfiles() as $role)
{
$roles[] = $role->getProfil();
foreach ($role->getPermissions() as $permission)
{
$permissions[] = $permission;
}
}
// Pour les utilisateurs ajoutés par le fournisseur, les droits sont gerés autrement
if (count($permissions) < 1)
{
foreach ($user->getPermissionFournisseurs() as $permission)
{
$permissions[] = $permission;
}
}
// le super admin peut tout faire
if (in_array(User::ROLE_SUPER_ADMIN, $roles))
{
return true;
}
// l'administrateur peut tout faire sauf les suppressions (qui seront au cas par cas)
if ($this->security->isGranted(User::ROLE_SUPER_ADMIN) && in_array($attribute, [self::VIEW, self::ADD, self::EDIT]))
{
return true;
}
if (count($permissions) < 1)
{
return false;
}
/** @var App\Entity\Permission $permission */
foreach ($permissions as $permission)
{
if ($permission->getModule() === $subject)
{
if (in_array($attribute, $permission->getAttributes()))
{
return true;
}
}
}
return false;
}
}