Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SYMFONY2] FOSUserBundle, connecter un utilisateur

SSO, LDAP

Anonyme
    17 juillet 2015 à 10:52:38

    Bonjour,

    Pour les besoins de mon applications, je dois pouvoir connecter un utilisateur sans que celui utilise le formulaire de connexion fournit par FOSUser. Je m'explique, lorsque l’utilisateur va sur mon application il doit au préalable être identifier sur un portail (LDAP) du coup je récupère les informations du LDAP, vérifie que l'utilisateur est bien présent dans le LDAP, créer le compte et connecter l'utilisateur.

    Actuellement, j'arrive très bien à vérifier que l'utilisateur LDAP existe et ajouter l'utilisateur dans mon application, sauf qu'impossible de connecter l'utilisateur à l'application (je tombe sur le formulaire de connexion et je suis toujours redirige dessus). Je tiens à préciser que mon security.yml est bon, l'intégration du LDAP et du SSO c'est faite après le développement de l'application.

    Ayant un peu cherché sur le net j'ai trouvé ce bout de code

    $token = new UsernamePasswordToken($user, null, "main", $user->getRoles());
    $this->security->setToken($token); // now the user is logged in
    
    // now dispatch the login event
    $event = new InteractiveLoginEvent($request, $token);
    $this->event->dispatch("security.interactive_login", $event);

    Sauf que voilà, dans la toolbar en bas j'ai bien affiché "utilisateur connecté" avec mon nom de compte, mais sinon le reste de Symfony me considère pas connecter. Je pense que le problème vient de FOSUser je ne dois pas l'informer correctement que utilisateur est connecté.

    Après avoir regardé le code de FOSuser, j'ai trouvé deux classes qui me semble intéressente :

    - EventListener/AuthenticationListener.php => je suppose qu'elle est appelé lors d'un évenement

    - Security/LoginManager.php => qui doit être un service de FOSUser

    Du coup je cherche à savoir comment je peux (via le code), connecter un utilisateur.

    Merci de votre aide.

    EDIT: Ajout de précision

    - Symfony 2.6.9

    - Dans la toolbar donc je suis bien connecté, mais j'arrive quand même sur le formulaire de login, quand je le remplis avec les informations de l'utilisateur "connecté", je deviens vraiment connecté

    -
    Edité par Anonyme 17 juillet 2015 à 12:15:06

    • Partager sur Facebook
    • Partager sur Twitter
      17 juillet 2015 à 11:27:00

      Salut,

      Ton firewall s'appelle bien main dans ton security.yml ?

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        17 juillet 2015 à 11:28:33

        Oui,

        Voilà mon security.yml

        security:
            providers:
                main:
                    id: fos_user.user_provider.username
        
            encoders:
                FOS\UserBundle\Model\UserInterface: sha512
        
            role_hierarchy:
                ROLE_ADMIN: ROLE_USER
        
            firewalls:
                dev:
                    pattern: ^/(_(profiler|wdt)|css|images|js)/
                    security: false
        
                login:
                    pattern: ^/(fr|en)/login$
                    anonymous: true
        
                main:
                    pattern:   ^/
                    anonymous: false
                    provider:  main
                    form_login:
                        login_path: fos_user_security_login
                        check_path: fos_user_security_check
                        default_target_path: btek_core_dashboard
                    logout:
                        path:   fos_user_security_logout
                        target: fos_user_security_login
        



        • Partager sur Facebook
        • Partager sur Twitter
          17 juillet 2015 à 11:36:40

          Je te file ce que j'ai dans un de mes projets et qui marche:

          // Authentifier l'utilisateur
          $firewall = "main";
          $token = new UsernamePasswordToken(
              $prospect->getUsername(),
              null,
              $firewall,
              $prospect->getRoles()
          );
          $token->setUser($prospect); // $prospect est un utilisateur récupérer depuis la bdd
          $this->get("security.token_storage")->setToken($token);
          $this->get('session')->set('_security_secured_area', serialize($token));

          C'est pour un projet en 2.4, je sais pas si c'est toujours d'actualité.

          -
          Edité par BibiBond 17 juillet 2015 à 11:37:08

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            17 juillet 2015 à 11:38:16

            Je vais essayer. Je suis en 2.6 la seul chose qui change et le nom des services (je crois)

            -
            Edité par Anonyme 17 juillet 2015 à 11:49:42

            • Partager sur Facebook
            • Partager sur Twitter
              17 juillet 2015 à 11:40:47

              Il me semble que j'avais fait la mise à jour vers 2.6 en fait :p 

              Je ne sais pas si ma façon de faire est la bonne non plus (je ne dispatch pas l'event comme toi, je devrais ptet...). Tiens moi au jus !

              -
              Edité par BibiBond 17 juillet 2015 à 11:41:07

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                17 juillet 2015 à 11:49:47

                Bon, j'ai le même résultat, toolbar indiquand que je suis connecter (même mon header affiche mon nom de compte) mais je suis toujours redirigé sur ma page de connexion même si je mets une autre URL.

                J'ai essayé avec et sans dispatch l'event.

                -
                Edité par Anonyme 17 juillet 2015 à 11:50:55

                • Partager sur Facebook
                • Partager sur Twitter
                  17 juillet 2015 à 11:55:06

                  Dans ce cas je ne vois pas, désolé :(
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    20 juillet 2015 à 11:37:53

                    Bon, après de multiple essai je pose ici la situation actuelle.

                    FOSuser utilise la classe AuthenticationListener pour connecter l'utilisateur après s'être enregistré. J'ai donc reproduis le fonctionnement dans mon service pour connecter l'utilisateur. J'appel donc la méthode : loginUser de la classe LoginManager ensuite je dispatch l'event FOSUserEvents::SECURITY_IMPLICIT_LOGIN (spécialement conçu lorsqu'on connecte un utilisateur via le code (d'après la doc.))

                    Pour me connecter sur la page du formulaire, j'ai étendu le controller SecurityController et la méthode loginAction. J'appel mon service avant (celui que tente la connexion via le SSO) puis ensuite j'appel la méthode parent loginUser pour laisser le formulaire de connexion.

                    Donc mon service pour connecter l'utilisateur arrive bien à contacter le serveur LDAP, créer l'utilisateur dans Symfony si besoin. Ensuite il est connecté (d'après la barre de debug Symfony) mais le pare-feu me redirige toujours sur la page de login.

                    Pour information le système de login fonctionnait très bien avant que j’intègre la fonctionnalité de connexion via le SSO.

                    Voilà la partie qui connecte l'utilisateur

                    private function connectUser($user, Request $request)
                    {
                        $this->loginManager->loginUser($this->firewall, $user);        
                        $this->event->dispatch(FOSUserEvents::SECURITY_IMPLICIT_LOGIN, new UserEvent($user, $request));
                    }


                    EDIT:

                    J'ai continué les tests, vu que le pare-feu de Symfony me redirigeais je l'ai désactiver pour faire des tests, et je remarque que dès que change de page (là ou mon code de connexion n'est pas exécute) je perds la connexion. (J'ai un AnonymousToken au lieu d'un UsernamePasswordToken)

                    -
                    Edité par Anonyme 21 juillet 2015 à 0:39:56

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      20 juillet 2015 à 11:48:40

                      Donc, j'ai fini par trouver la solution pour ceux que ça intéresse.

                      J'étais bien authentifier, mais authentifier dans le firewall login et non main.

                      Du coup, normalement la classe loginManager on peut lui envoyer un nom de firewall spécifique (mais ça ne fonctionnais pas).

                      Alors j'ai changé mon security.yml. Que voici

                      security:
                          providers:
                              main:
                                  id: fos_user.user_provider.username
                      
                          encoders:
                              FOS\UserBundle\Model\UserInterface: sha512
                      
                          role_hierarchy:
                              ROLE_ADMIN: ROLE_USER
                      
                          firewalls:
                              dev:
                                  pattern: ^/(_(profiler|wdt)|css|images|js)/
                                  security: false
                      
                              main:
                                  pattern: ^/
                                  anonymous: ~
                                  form_login:
                                      login_path: fos_user_security_login
                                      default_target_path: btek_core_dashboard
                                  logout:
                                      path:   fos_user_security_logout
                                      target: %portal_auth_bosstek%
                      
                          access_control:
                              - { path: ^/(fr|en)/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
                              - { path: ^/, roles: IS_AUTHENTICATED_FULLY }


                      Pour information, j'ai aussi retirer le formulaire de connexion (pour ça qu'il manque la path login_check)

                      -
                      Edité par Anonyme 27 juillet 2015 à 15:53:06

                      • Partager sur Facebook
                      • Partager sur Twitter

                      [SYMFONY2] FOSUserBundle, connecter un utilisateur

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown