Symfony 2 – Vérifier le role d’un utilisateur dans un Voter

Petit How-To sur comment vérifier si un utilisateur à bien le rôle nécessaire pour effectuer une action dans un Voter.

Avant tout, deux petits lien, l’un vers la documentation des Voter de Symfony 2 et le second sur le fonctionnement du Gestionnaire de décision d’accès (Access Decision Manager) .

Nous verrons ici comment tester si l’utilisateur en cours dispose bien d’un rôle en prenant en compte la hiérarchisation des rôles offert par Symfony 2.

 

Dans un premier temps, il faut ajouter dans le fichier de configuration de l’injection de dépendance, une dépendance au service “security.access.role_hierarchy_voter”.

Votre déclaration de Voter ressemblera à cela :

<service id="security.voter.categorie" class="MyBundle\Security\Authorization\Voter\CategorieVoter" public="false">
   <argument type="service" id="security.access.role_hierarchy_voter" />
   <tag name="security.voter" />
</service>

Dans la classe de votre Voter, il faut bien entendu ajouter un attribut et le constructeur pour récupérer le service.

namespace MyBundle\Security\Authorization\Voter;

use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\User\UserInterface;

class CategorieVoter implements VoterInterface
{
    /**
     * @var \Symfony\Component\Security\Core\Authorization\Voter\RoleHierarchyVoter
     */
    private $roleVoter;

    public function __construct($roleVoter)
    {
            $this->roleVoter = $roleVoter;
    }
//...
}

L’utilisation est simple.

if($this->roleVoter->vote($token, $token->getUser(), array('ROLE_USER')) === VoterInterface::ACCESS_GRANTED) {
      // l’utilisateur à le role
}

Donc si votre utilisateur à un rôle admin, selon la hiérarchie des rôles, il à aussi un ROLE_USER. Donc le service renverra un VoterInterface::ACCESS_GRANTED !

Tagués avec : , ,
Publié dans PHP, Symfony2

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*