IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Roles du user et security.context [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    424
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 424
    Par défaut Roles du user et security.context
    Bonjour,
    J'ai un soucis assez curieux.
    J'ai personnalisé mon bundle sécurité. Au cours de l'authentification, je charge les rôles de l'utilisateur mais ensuite, presque tout se passe comme si l'utilisateur n'avait aucun rôle.
    Si je fais ça dans mon contrôleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class DefaultController extends Controller
    {
        public function indexAction($name)
        {
            $user = $this->get('security.context')->getToken()->getUser();
            $roles = $user->getRoles();
            return $this->render('Cpam35JoBundle:Default:index.html.twig', array('name' => $name, 'user' => $user, 'roles'=> $roles));
        }
    et que j'affiche roles dans le twig avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <pre>
        {{ roles }}
        {{ user }}
    </pre>
    j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Array
        Array
    (
         ...
         [roles] => array
              (
                  [0] => ROLE_USER,
                  [1] => ROLE_ADMIN
              )
         ...
    )
    Le tableau 'roles' est affiché comme nul alors que, dans le user, le tableau semble renseigné.

    Mon user contient une fontion __toString qui fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        public function __toString()
        {
            return print_r(array(...
                        "roles" => $this->getRoles(),
                        ...), true);
     
        }
    Comment est-ce possible ?
    J'ai bien une variable $roles dans $user, qui semble bien affectée quand je passe par le __toString mais qui semble vide lorsque je passe par le getRoles()

    Quelqu'un a-t-il une idée ?
    Merci

  2. #2
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    424
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 424
    Par défaut Correction
    Correction... Si je fais un print_r($roles, true), l'affichage marche.

    Par contre, je n'ai toujours pas ces rôles au niveau du security.context : isGranted renvoie false même si je teste un rôle de l'utilisateur.
    De même la toolbar de symfony n'affiche pas ces rôles.

  3. #3
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    424
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 424
    Par défaut
    Erreur trouvée.
    Pour que les rôles soient bien pris en considération, il est indispensable de les passer en paramètre lors de la création du Token authentifié.
    Les roles utilisés par symfony sont ceux du Token et non ceux de l'utilisateur.

  4. #4
    Membre émérite
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Par défaut
    Heu pas tout à fait si tu passes un Objet User qui a une méthode getRoles, ben tu passes l'objet User au Token et ça roules.

  5. #5
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    424
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 424
    Par défaut
    tu passes l'objet User au Token et ça roules.
    A quel moment ?
    Parce que mon $user, il a bien une méthode getRoles mais ça ne fonctionnait pas.

  6. #6
    Membre émérite
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Par défaut
    Est ce que tes roles sont en bdd ?

  7. #7
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    424
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 424
    Par défaut
    Non.
    Ils sont renvoyés par un autre programme d'authentification qui utilise une carte en entrée.

  8. #8
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    424
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 424
    Par défaut
    Mais comme le montre le code du premier post, les rôles de l'utilisateur sont bien alimentés. C'est en faisant le pas à pas de la fonction isGranted que j'ai vu que c'étaient les rôles du Token qui étaient utilisés.
    Pour les initialiser, il faut faire un new Token($roles). Sinon, ça ne semble pas fonctionner.

  9. #9
    Membre émérite
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Par défaut
    Effectivement, après fait un tour dans mon code, la création d'un token personnalisé étends la classe abstract token qui a dans son constructeur un array de roles.

    Cette classe a comme méthode setUser qui permet de mettre dans le token le User du moment qu'il implémente UserInterface.

    Désolé pour la méprise.

  10. #10
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    424
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 424
    Par défaut
    Pas de problème. Merci d'avoir voulu aider. D'un certain côté, ça me rassure :-) .
    Pour conclure sur l'état de mes expérimentations (si ça peut aider).
    Le Token nécessite un array de rôle comme argument du constructeur si l'on veut utiliser les outils proposés par symfony (access control, isGranted('ROLE_...')...

    Le user ne peut être affecté au Token qu'ensuite avec la fonction setUser($user) mais cela ne change rien sur les rôles. Ceux qui sont utilisés sont ceux du Token.

    Pour finir, j'ai tenté d'ajouter une méthode setRoles à mon Token mais la variable $roles de l'abstractToken étant privée, le $this->roles de mon Token personnalisé crée un autre attribut $roles et ce n'est pas lui qui est ensuite utilisé (c'est vicieux, pas vrai ?). Du coup, l'unique moyen que j'ai pu trouver, c'est de recréer un nouveau Token au moment où j'ai récupéré les rôles. Un peu lourd, mais ça fonctionne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/09/2014, 11h46
  2. [2.x] Security Context dans le boot d'un Bundle
    Par golf3gtiii dans le forum Symfony
    Réponses: 3
    Dernier message: 03/12/2011, 12h16
  3. [2.x] security.context dans le FindAll() d'une table jointe
    Par khand dans le forum Symfony
    Réponses: 7
    Dernier message: 26/10/2011, 11h24
  4. NULL security context [RHEL 5.6]
    Par irtimid42 dans le forum RedHat / CentOS / Fedora
    Réponses: 0
    Dernier message: 12/07/2011, 09h33
  5. JasperServer : Création de role et user
    Par sandF dans le forum Jasperserver
    Réponses: 3
    Dernier message: 28/10/2008, 13h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo