Symfony 2 - Chargement des rôles de base de données

Mes rôles sont stockés dans la base de données et je suis en train de charger dynamiquement lors de la connexion. Ce que je fais, c'est l'interrogation de l'rôles et de les placer sur l'objet utilisateur dans mon utilisateur fournisseur comme on le voit ici:

public function loadUserByUsername($username) {
    $q = $this
        ->createQueryBuilder('u')
        ->where('u.username = :username')
        ->setParameter('username', $username)
        ->getQuery()
    ;

    try {
        //The Query::getSingleResult() method throws an exception
        //if there is no record matching the criteria.
        $user = $q->getSingleResult();

        //Permissions
        $permissions = $this->_em->getRepository('E:ModulePermission')->getPermissionsForUser($user);

        if ($permissions !== null) {
            foreach ($permissions as $permission) {
                $name = strtoupper(str_replace(" ", "_", $permission['name']));

                $role = "ROLE_%s_%s";

                if ($permission['view']) {
                    $user->addRole(sprintf($role, $name, 'VIEW'));
                }

                if ($permission['add']) {
                    $user->addRole(sprintf($role, $name, 'ADD'));
                }

                if ($permission['edit']) {
                    $user->addRole(sprintf($role, $name, 'EDIT'));
                }

                if ($permission['delete']) {
                    $user->addRole(sprintf($role, $name, 'DELETE'));
                }
            }
        }

    } catch (NoResultException $e) {
        throw new UsernameNotFoundException(sprintf('Unable to find an active admin Entity:User object identified by "%s".', $username), null, 0, $e);
    }

    return $user;
}

Et l'entité utilisateur:

class User implements AdvancedUserInterface, \Serializable {
    ....

    protected $roles;

    ....

    public function __construct() {
        $this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
        $this->roles = array();
    }


    ....


    public function getRoles() {
        $roles = $this->roles;

        //Ensure we having something
        $roles[] = static::ROLE_DEFAULT;

        return array_unique($roles);
    }

    public function addRole($role) {
        $role = strtoupper($role);
        $roles = $this->getRoles();
        if ($role === static::ROLE_DEFAULT) {
            return $this;
        }

        if (!in_array($role, $roles, true)) {
            $this->roles[] = $role;
        }

        return $this;
    }

    public function hasRole($role) {
        $role = strtoupper($role);
        $roles = $this->getRoles();
        return in_array($role, $roles, true);
    }
}

Cela fonctionne bien et dandy, et je vois le bon rôles, quand je fais:

$this->get('security.context')->getUser()->getRoles()

Le problème (je pense), c'est que le jeton ne sais pas à propos de ces rôles. Parce que l'appel de getRoles() sur le jeton, ne montrant que ROLE_USER, ce qui est le rôle par défaut.

Il me semble que le jeton est créé avant que l'utilisateur est chargé par le UserProvider. J'ai regardé, par beaucoup du composant de sécurité, mais je ne peux pas pour la vie de me trouver la partie droite du processus de crochet dans la définition de ces rôles correctement de sorte que la marque sait à leur sujet.

Mise à jour à la Suite de la Charge de rôles à partir de la base de données doc fonctionne très bien, mais cela ne correspond pas à mon cas d'utilisation comme indiqué ici. Mon schéma diffère que chaque rôle dispose d'autorisations supplémentaires (afficher/ajouter/modifier/supprimer) et c'est pourquoi je suis tenté l'approche ici. Je ne veux pas avoir à modifier mon schéma pour travailler avec Symfony de sécurité. Je préfère comprendre pourquoi ces rôles ne sont pas lié correctement (pas sûr de la bonne doctrine mot ici) sur mon objet utilisateur à ce point.

InformationsquelleAutor Magic Hat | 2014-01-08