Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony] Authentification impossible

    21 janvier 2018 à 4:21:22

    Bonjour,

    Depuis deux jours, j'ai un problème avec l'authentification sur Symfony, après avoir essayé 45 configurations différentes, d'avoir recommencé deux fois le projets, avoir remis à zéro mon serveur pour refaire une nouvelle configuration avec PHP 7.2, le problème demeure.

    Lorsque l'utilisateur va écrire ses identifiants il va être redirigé sur la page de check (dans mon cas /login) et la page va rester intégralement blanche, cet-à-dire qu'il n'y aura même pas le Profiler.

    Sur la nouvelle installation de Symfony j'en ai profité pour installer la dépendance Monolog (sachez que je travaille avec Symfony 4) dont voici le résultat après une tentative de connexion :

    [2018-01-21 03:09:28] request.INFO: Matched route "security_login". {"route":"security_login","route_parameters":{"_locale":"fr","_controller":"App\\Controller\\SecurityController::login","_route":"security_login"},"request_uri":"http://snowtricks.jeremy-barette.fr/fr/login","method":"GET"} []
    [2018-01-21 03:09:28] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
    [2018-01-21 03:09:29] request.INFO: Matched route "_wdt". {"route":"_wdt","route_parameters":{"_controller":"web_profiler.controller.profiler:toolbarAction","token":"818ef5","_route":"_wdt"},"request_uri":"http://snowtricks.jeremy-barette.fr/_wdt/818ef5","method":"GET"} []
    [2018-01-21 03:09:35] request.INFO: Matched route "security_login". {"route":"security_login","route_parameters":{"_locale":"fr","_controller":"App\\Controller\\SecurityController::login","_route":"security_login"},"request_uri":"http://snowtricks.jeremy-barette.fr/fr/login","method":"POST"} []
    [2018-01-21 03:09:35] doctrine.DEBUG: SELECT t0.id AS id_1, t0.avatar AS avatar_2, t0.username AS username_3, t0.email AS email_4, t0.password AS password_5, t0.is_active AS is_active_6, t0.token_reset AS token_reset_7 FROM users t0 WHERE t0.username = ? LIMIT 1 ["Arzaor"] []
    [2018-01-21 03:09:36] security.INFO: User has been authenticated successfully. {"username":"Arzaor"} []

    La connexion se fait effectivement mais la page reste blanche si j'ai de la chance je vais pouvoir revenir sur l'accueil sans problème sinon il va falloir que je redémarre PHP FPM.

    framework.yaml

    framework:
        secret: '%env(APP_SECRET)%'
        default_locale: fr
        csrf_protection: { enabled: true }
    
        http_method_override: true
        #trusted_hosts: ~
    
        # Enables session support. Note that the session will ONLY be started if you read or write from it.
        # Remove or comment this section to explicitly disable session support.
        session:
            handler_id: ~
    
        #esi: ~
        #fragments: ~
        php_errors:
            log: true
    
        cache:
            # The app cache caches to the filesystem by default. Other options include:
    
            # Redis
            #app: cache.adapter.redis
            #default_redis_provider: redis://localhost
    
            # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues)
            #app: cache.adapter.apcu
        validation: { enable_annotations: true }

    security.yaml

    security:
        encoders:
            App\Entity\User: bcrypt
    
        providers:
            database_users:
                entity: { class: App\Entity\User, property: username }
    
        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            main:
                pattern: ^/
    
                anonymous: true
    
                # activate different ways to authenticate
    
                http_basic: ~
                # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
    
                form_login:
                    check_path: security_login
                    login_path: security_login
                    default_target_path: default
    
                logout:
                    path: security_logout
                    target: default
    

    SecurityController.php

    <?php
    namespace App\Controller;
    
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
    
    class SecurityController extends Controller
    {
        /**
         * @Route("/{_locale}/login", name="security_login", defaults={"_locale": "fr"}, requirements={"_locale": "en|fr"})
         *
         * @param AuthenticationUtils $utils
         * @return Response
         */
        public function login(AuthenticationUtils $utils): Response
        {
            return $this->render('Security/login.html.twig', [
                'lastUsername'  =>  $utils->getLastUsername(),
                'error'         =>  $utils->getLastAuthenticationError()
            ]);
        }
    
        /**
         * @Route("/{_locale}/logout", name="security_logout", defaults={"_locale": "fr"}, requirements={"_locale": "en|fr"})
         *
         * @throws \Exception
         */
        public function logout()
        {
            throw new \Exception('Refresh your page, please !');
        }
    }
    

    login.html.twig

    {% extends 'base.html.twig' %}
    
    {% block body %}
        <h2>{% trans %}Connexion{% endtrans %}</h2>
        <div class="row">
            <div class="col-sm-12">
                <form action="{{ path('security_login') }}" method="POST">
                    <div class="form-group">
                        <label for="username">{% trans %}Nom d'utilisateur{% endtrans %}</label>
                        <input type="text" class="form-control" id="username" name="_username" value="{{ lastUsername }}">
                    </div>
                    <div class="form-group">
                        <label for="password">{% trans %}Mot de passe{% endtrans %}</label>
                        <input type="password" class="form-control" id="password" name="_password">
                    </div>
                    <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"/>
                    <a href="">{% trans %}Mot de passe oublié ?{% endtrans %}</a><br><br>
                    <button type="submit" class="btn-secondary btn">{% trans %}Connexion{% endtrans %}</button>
                </form>
                {% if error %}
                    <div class="alert alert-danger" role="danger">
                        {{ error.messageKey(error.messageData, 'security') }}
                    </div>
                {% endif %}
            </div>
        </div>
    {% endblock %}

    Je pense vous avoir donné tous les codes qui concernent l'authentification, j'espère que vous aurez des solutions.

    Merci d'avance,


    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2018 à 8:53:49

      Petite différence entre nos deux firewalls :

      main:
          pattern:   ^/
          anonymous: true
          provider:  main
          logout_on_user_change: true
      
          form_login:
              login_path: login
              check_path: login_check
      
          logout:
              path:       logout
              target:     login

      Et dans mon fichier routing.yml :

      login:
          path: /login
          defaults: { _controller: AppBundle:Security:login }
      
      login_check:
          path: /login_check
      
      logout:
          path: /logout

      Mon contrôleur :

      class SecurityController extends Controller
      {
          public function loginAction(Request $request)
      	{
      		if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
      			return $this->redirectToRoute('home');
      		}
      		
      		$authenticationUtils = $this->get('security.authentication_utils');
      
      		return $this->render('login.html.twig', array(
      		  'last_username' => $authenticationUtils->getLastUsername(),
      		  'error'         => $authenticationUtils->getLastAuthenticationError(),
      		));
      	}
      	
      }
      

      Cette configuration marche aussi bien chez moi en local qu'en ligne...





      -
      Edité par HarvestR 21 janvier 2018 à 8:58:20

      • Partager sur Facebook
      • Partager sur Twitter
        21 janvier 2018 à 13:34:44

        Bonjour,

        Merci pour ton message. Malheureusement toujours le même résultat, je me demande si c'est vraiment un soucis de configuration au niveau de Symfony parce que la connexions s'effectue, il n'arrive juste pas à stocker le token.

        • Partager sur Facebook
        • Partager sur Twitter
          21 janvier 2018 à 15:15:31

          Tu as dans ton pare-feu

          check_path: security_login
          login_path: security_login

          Tu devrais avoir deux chemins différents (voir mon exemple)

          • Partager sur Facebook
          • Partager sur Twitter
            21 janvier 2018 à 19:21:19

            Ça ne doit pas poser de soucis, surtout que cette configuration fonctionnait parfaitement sur une autre application.

            C’est un C/C de celle fournie sur la démo de Symfony 4 : https://github.com/symfony/demo/blob/master/config/packages/security.yaml

            -
            Edité par Arzaor 21 janvier 2018 à 19:21:46

            • Partager sur Facebook
            • Partager sur Twitter
              22 janvier 2018 à 15:27:55

              Salut,

              Edit : réponse incorrecte : Symfony utilise le premier provider configuré si pas définie dans le firewall.

              Sauf erreur de ma part, il semble qu'il manque le provider à utiliser dans la configuration de ton firewall comme expliqué ici : https://symfony.com/doc/current/security/entity_provider.html#security-config-entity-provider

              Essaye d'ajouter le provider à utiliser dans ton firewall comme ceci :

              security:
                  encoders:
                      App\Entity\User: bcrypt
               
                  providers:
                      database_users:
                          entity: { class: App\Entity\User, property: username }
               
                  firewalls:
                      dev:
                          pattern: ^/(_(profiler|wdt)|css|images|js)/
                          security: false
                      main:
                          pattern: ^/
                          anonymous: true
              			
                          provider: database_users
              			
                          http_basic: ~
               
                          form_login:
                              check_path: security_login
                              login_path: security_login
                              default_target_path: default
               
                          logout:
                              path: security_logout
                              target: default
              


              Bonne journée,

              -
              Edité par Pitet 22 janvier 2018 à 15:32:17

              • Partager sur Facebook
              • Partager sur Twitter

              [Symfony] Authentification impossible

              × 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