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.
Vous devez vous connecter pour publier un commentaire.
Il semble que vous ne pouvez pas être au courant de la construction dans le rôle de la gestion que Symfony offre. Lire les docs - La gestion des rôles dans la base de données Il est en fait assez simple à faire ce que vous voulez, tout ce que vous devez faire est de mettre en œuvre une interface et de définir votre fonction nécessaire. Les docs que j'ai lié de fournir d'excellents exemples. Prendre un coup d'oeil.
Mise à JOUR
On dirait les docs ne vous donnent pas les
use
déclaration pour la AdvancedUserInterface. Ici, il est:puis dans votre rôle d'entité:
Les docs vous montrer comment faire le reste.
Mise à JOUR
Prendre un coup d'oeil à ce blog, qui vous montre comment créer des rôles de manière dynamique:
Créer dynamiquement des rôles
roles
variable doit être de typeArrayCollection
, si dans votregetRoles
fonction, vous sont en train de redéfinir la$roles
variable de sorte qu'il devient un nouveau tableau, avec un seul élément (le ROLE_USER que vous venez d'affecter à elle). La doctrine docs vous montrer ce que vous pouvez faire avec un tableau de la collection, vous pourriez vouloir essayer letoArray()
fonction qui convertit le tableau de la collection d'un tableau php.RoleInterface
? Pourriez-vous également de comprendre votre Rôle entité s'il vous plaît?Le problème ici tient au fait que je pensais que j'étais la mise en œuvre de
mais n'était pas (comme vous pouvez le voir dans la question d'origine, j'ai oublié de l'ajouter à ma définition de la classe). Je pars de ce ici pour les gens si ils viennent à travers elle. Tous vous avez besoin est de mettre en œuvre cette interface, et ajoutez la méthode suivante à votre entité utilisateur.