Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 3] Sécurité : déconnexion à chaque action

Perte de la connexion à chaque action

    21 février 2017 à 10:59:45

    Bonjour, 

    Je suis en fin de création d'un site web sous Symfony 3 qui permet notamment de gérer des utilisateurs. Mon problème ne s'est manifesté que très récemment et je n'arrive pas à comprendre ce que j'ai modifié pour que ça ne fonctionne plus correctement.

    Je vous explique : lorsque je me connecte et que je fais des actions en tant qu'utilisateur classique, tout va bien. Mais lorsque j'accède à l'espace d'administration, je ne peux plus faire d'action sans repasser par le formulaire de login et je tourne en boucle. Par exemple, une fois connectée sur mon site, j'accède au panneau d'administration et je clique sur "ajouter un utilisateur". Une fois le formulaire rempli, quand je veux enregistrer je suis redirigée vers la page de login puis vers la page d'accueil quand je me re-log. Dans le profiler, l'accès est refusé car je ne suis plus connecté : au moment d'enregistrer en base je deviens anonyme o_O

    Je vous joint mon code pour plus de détails, et mon entité User car c'est le cœur de mon site.

    #app/config/security.yml
    
    security:
        encoders:
            Selea\SiteBundle\Entity\User: bcrypt
        
        role_hierarchy:
            ROLE_ADMIN:      ROLE_USER
            ROLE_SUPERADMIN: [ROLE_ADMIN, ROLE_USER, ROLE_ALLOWED_TO_SWITCH]
    
        access_control:
            - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/admin, roles: [ROLE_ADMIN] }
            - { path: ^/account, roles: IS_AUTHENTICATED_FULLY }
        
        providers:
            main:
                entity:
                    class: SeleaSiteBundle:User
    
        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
    
            login:
                pattern: ^/login$
                security: false
                anonymous: true
            
            main:
                pattern: ^/
                anonymous: true
                provider: main
                form_login:
                    login_path: selea_login
                    check_path: selea_login_check                
                logout:
                    path: selea_logout
                    target: /
    #app/config/routig.yml
    
    selea_login:
        path: /login
        defaults: { _controller: SeleaSiteBundle:Security:login }
    
    selea_login_check:
        path: /login_check
    
    selea_logout:
        path: /logout
    /* extrait de mon entité USER */
    <?php
    
    namespace Selea\SiteBundle\Entity;
    
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Security\Core\User\AdvancedUserInterface;
    
    /**
     * User
     *
     * @ORM\Table(name="user")
     * @ORM\Entity(repositoryClass="Selea\SiteBundle\Repository\UserRepository")
     */
    class User implements AdvancedUserInterface, \Serializable
    {
        private $id;
        private $username;
        private $password;
        private $roles = array();
        private $isActive;
        private $salt;
    
        private $clearPassword;
    
        private $firstname;
        private $lastname;
        private $email;
        private $company;
    	
    	public function __construct()
    	{
    		$this->isActive = false;
    	}
    
    	/** @see \Serializable::serialize() */
        public function serialize()
        {
            return serialize(array(
                $this->id,
                $this->username,
                $this->password,
    			$this->isActive
            ));
        }
    
        /** @see \Serializable::unserialize() */
        public function unserialize($serialized)
        {
            list (
                $this->id,
                $this->username,
                $this->password,
    		    $this->isActive
            ) = unserialize($serialized);
        }
    	
    	public function eraseCredentials()
    	{
    	}
    	
    	public function isAccountNonExpired()
    	{
    		return true;
    	}
    
    	public function isAccountNonLocked()
    	{
    		return true;
    	}
    
    	public function isCredentialsNonExpired()
    	{
    		return true;
    	}
    
    	public function isEnabled()
    	{
    		return $this->isActive;
    	}
    }
    


    S'il vous faut des fichiers supplémentaires pour comprendre, dites-le moi. Je suis complètement perdue, je ne sais pas d'où vient le problème.

    Merci d'avance pour votre aide :)


    • Partager sur Facebook
    • Partager sur Twitter
      21 février 2017 à 14:57:36

      Salut, 

      A première vue, je ne vois pas d'erreurs... As-tu quelque chose dans les logs ? 

      Simple test : pourrais-tu essayer de changer la ligne 

      - { path: ^/account, roles: IS_AUTHENTICATED_FULLY }


      et mettre tous les rôles qu'il faut avoir pour pouvoir nager dans cette eau là ? 

      Autre chose, comment tu passes de /account à /admin dans ton code ? 

      -
      Edité par rusgrechka 21 février 2017 à 15:00:54

      • Partager sur Facebook
      • Partager sur Twitter
        21 février 2017 à 21:11:22

        Bonsoir, je passe rapidement pour prévenir que ma box ne fonctionne plus depuis cette après-midi (je travaille de chez moi). Je teste dès que je peux et je reviens te donner mes résultats. 

        Merci !

        -
        Edité par Selea 24 février 2017 à 8:32:04

        • Partager sur Facebook
        • Partager sur Twitter
          24 février 2017 à 8:32:36

          Bonjour rusgrechka (et tous ceux qui passent par la :) ), je suis enfin de retour.

          Le path /account n'a en fait qu'une seule route pour le moment, j'ai donc supprimé la ligne et ajouté l'annotation

          /**
           * @Security("has_role('ROLE_USER')")
           */

          devant l'action correspondante dans le contrôleur, qui remplacerait donc la ligne 

          - { path: ^/account, roles: ROLE_USER }

          Cette partie permet d'accéder au compte utilisateur.

          J'ai bien analysé ce que je faisais pour que ça se produise. Quand je me connecte à mon site pour accéder à l'administration, tout va bien. Mais si je garde l'onglet ouvert mais pas actif pendant un certain temps (je n'ai pas évalué le temps exacte), c'est à ce moment-là que le bug survient. 

          C'est comme si ma session n'était pas retrouvée, ou quelque chose de ce genre. Le soucis c'est que je ne touche absolument pas à cette partie.

          As-tu une idée de ce qui peut se passer ?

          Merci

          • Partager sur Facebook
          • Partager sur Twitter

          [Symfony 3] Sécurité : déconnexion à chaque action

          × 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