<?php
namespace App\Security\Voter;
use App\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
use Symfony\Component\Yaml\Yaml;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use App\Entity\Permission;
use App\Repository\RoleRepository;
class UtilisateursVoter Implements VoterInterface {
protected $actions = array();
public function __construct(\Doctrine\ORM\EntityManagerInterface $entityManager, \Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface $tokenStorage){
$this->entityManager = $entityManager;
$this->tokenStorage = $tokenStorage;
}
// Symfony demandera à cette classe si elle prend en charge ce type d'action sur cet objet
protected function supports($attributes, $subject) {
// Si c'est attribut ne supportant pas un des sujets on dégage
if (!in_array($attributes[0], $this->actions) && !strstr($attributes[0], "utilisateurs_")) {
return false;
}
return true;
}
/**
*
* @param type $attribute représente l'action qu'on tente de faire
* @param type $subject
* @param TokenInterface $token
* @return boolean
* @throws \LogicException
*/
public function vote(TokenInterface $token, $subject,array $attributes): int {
if(!$this->supports($attributes, $subject)){
return false;
}
$user = $this->tokenStorage->getToken()->getUser();
// L'utilisateur doit être connecté
if (!$user instanceof User) {
return false;
}
// à ce stade le sujet est forcément un objet DemandeRecrutement ( grace à la méthode supports )
/** @var DemandeRecrutement $dr */
$dr = $subject;
switch ($attributes[0]) {
default:
return $this->canDo($attributes[0],$user);
break;
}
throw new \LogicException('Action Interdite!');
}
public function isAllowed($droit, $user) {
$userRole = $user->getRole();
// Si user superadmin
if ($userRole->getId() == \App\Enum\RoleCollection::SUPERADMIN_ID) {
return true;
}
$objDroit = $this->entityManager->getRepository(\App\Entity\Permission::class)->findOneByCode($droit);
if(is_null($objDroit)){
return false;
}
$arrRoles = $objDroit->getRole($userRole)->toArray();
if(empty($arrRoles)){
return false;
}
foreach($arrRoles as $role){
if($role->getId() == $userRole->getId()){
return true;
}
}
return false;
}
private function canDo($action,User $user){
return $this->isAllowed($action, $user);
}
}