Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony3] Form login : paramétrer security.yml

Sujet résolu
    1 avril 2016 à 15:22:12

    Bonjour,

    J'ai suivi le tuto de symfony pour créer un formulaire de connexion (login form).

    Mon interface doit être entièrement privée, je n'ai pas de partie publique, si ce n'est le formulaire de connexion (je n'ai donc pas besoin de faire monsite.com/admin/ pour mettre ma partie privée).

    Quand je vais sur la page d'accueil ( / ), cela me demande de me connecter. J'ai donc une redirection vers monsite.com/login. Jusque là, tout va bien.

    Mais j'ai une boucle sur mon form login. Je n'arrive pas à me loguer en fait. A chaque fois que je valide mon form, j’atterris sur ma page de login, et je n'ai aucune erreur. En fonctionnement normal, je devrais tomber sur l'url à laquelle j'ai essayé d'accéder (ici la page d'accueil).

    Je précise que j'ai bien un index.html.twig avec du contenu dedans.

    security.yml

    J'ai 2 firewall différents afin de pouvoir paramétrer la page login à part (users anonymes autorisés).

    security:
        providers:
            in_memory:
                memory:
                   users:
                      edaffaud:
                         password: testeve
                         roles: 'ROLE_ADMIN'
    
        encoders:
            Symfony\Component\Security\Core\User\User: plaintext
    
        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
    
            login_firewall:
                pattern:   ^/login$
                anonymous: ~
    
            secured_area:
                pattern:   ^/
                provider: in_memory
                form_login:
                    login_path: login
                    check_path: login
    
                    # csrf token options
                    csrf_parameter:       _csrf_token
                    csrf_token_id:        authenticate
                    csrf_token_generator: security.csrf.token_manager
    
                logout:
                    path:   /logout
                    target: /
    
        access_control:
            - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/, roles: ROLE_ADMIN }
    


    Concernant la page /login, j'ai bien respecté les recommandations de symfony dans le paragraphe "Avoid common pitfalls" partie 2.

    L'action de mon formulaire va bien sur la route "login".

    SecurityController.php

    <?php
    
    namespace AppBundle\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Request;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    
    class SecurityController extends Controller
    {
       /**
       * @Route("/login", name="login")
       */
       public function loginAction(Request $request)
       {
    
          $authenticationUtils = $this->get('security.authentication_utils');
    
          // get the login error if there is one
          $error = $authenticationUtils->getLastAuthenticationError();
    
          // last username entered by the user
          $lastUsername = $authenticationUtils->getLastUsername();
    
          return $this->render(
             'security/login.html.twig',
             array(
                'last_username' => $lastUsername,
                'error'         => $error,
             )
          );
       }
    }
    

    J'ai remarqué aussi que si je mets n'importe quoi comme identifiants, Symfony ne m'affiche pas le message d'erreur comme il est sensé le faire. Pourtant, dans login.html.twig, j'ai bien mis le code pour qu'il l'affiche.

    Je n'arrive pas à voir où je me trompe...

    J'ai essayé avec la méthode "http_basic" et tout fonctionne bien, mais je ne trouve pas que ce soit très "user friendly", c'est pour cela que j'aimerai un joli form de connexion :)

    Si vous pouviez m'aider... Même si vous connaissez juste Symfony2, je pense que votre aide peut être précieuse ! Merci.

    -
    Edité par Felurian 4 avril 2016 à 8:20:13

    • Partager sur Facebook
    • Partager sur Twitter
      4 avril 2016 à 10:12:29

      Hello,

      Tu as eu raison de créer un deuxième firewall. Par contre, je ne comprends pas ton check_path. En principe, c'est la brique de sécurité de Symfony qui s'occupe de ça tout seul en interceptant les requêtes sur la route /login_check.

      Relis cette partie et assure-toi que ton que tout est OK de ton côté.

      • Partager sur Facebook
      • Partager sur Twitter
        4 avril 2016 à 11:17:47

        Bonjour, merci pour ta réponse !

        Alors, j'ai fait comme dans le tuto de Symfony où il marquait la même route pour le login_path et le check_path.

        # app/config/security.yml
        security:
            # ...
        
            firewalls:
                main:
                    anonymous: ~
                    form_login:
                        login_path: login
                        check_path: login


        Avec Symfony3, cela doit être différent de Symfony2, il n'y a pas besoin de spécifier le login_check, cela doit être déjà intégré.

        Voir cette page : http://symfony.com/doc/current/cookbook/security/form_login_setup.html

        • Partager sur Facebook
        • Partager sur Twitter
          4 avril 2016 à 11:24:41

          J'ai trouvé la solution ! J'avais bien un problème dans mon security.yml, il faut apparemment ajouté "anonymous: ~" dans le firewall global et il n'y a pas besoin de faire un firewall exprès pour la page de login.

          Je ne comprends pas trop pourquoi ça marche car pour moi ce n'est pas logique mais bon... J'ai trouvé cette solution sur ce topic.

          Ceci fonctionne pour moi :

          firewalls:
                  dev:
                      pattern: ^/(_(profiler|wdt)|css|images|js)/
                      security: false
          
                  main:
                      pattern:   ^/
                      provider: in_memory
                      anonymous: ~
                      form_login:
                          login_path: /login
                          check_path: /login
          
                          # csrf token options
                          csrf_parameter:       _csrf_token
                          csrf_token_id:        authenticate
                          csrf_token_generator: security.csrf.token_manager
          
                      logout:
                          path:   /logout
                          target: /
          
              access_control:
                  - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
                  - { path: ^/, roles: ROLE_ADMIN }


          Ce qu'il se passe :

          Quand j'essaye d'accéder à la page d'accueil de mon interface, cela me redirige vers mon formulaire de login.
          Ensuite, j'entre les identifiants de l'utilisateur que j'ai déclaré dans le provider "in_memory", l'utilisateur est reconnu et cela me redirige automatiquement sur la page d'accueil avec le contenu que je souhaite voir.

          Quand j'entre de mauvais identifiants, j'ai bien le message "invalid credentials". A ce propos, est-il possible de changer ce message pour le mettre en français ? :D

          Du coup, le login_check est bien exécuté mais sans avoir besoin de déclarer une route login_check.

          -
          Edité par Felurian 4 avril 2016 à 11:25:10

          • Partager sur Facebook
          • Partager sur Twitter
            5 avril 2016 à 9:07:15

            Pour avoir "invalid credentials" en français, il suffit de changer le paramètre locale dans config.yml

            parameters:
                locale: fr


            Et il faut aussi décommenter le paramètre translator dans la partie framework de ce même fichier :

            framework:
                # ...
                translator:      { fallbacks: ["%locale%"] }

            Videz le cache et normalement, vous devriez avoir le français.

            • Partager sur Facebook
            • Partager sur Twitter

            [Symfony3] Form login : paramétrer security.yml

            × 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