Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Je veux mettre en place un système de Cookies qui permet à mes utilisateurs, lorsqu'ils cochent la cas "Remember Me" de ne pas devoir se reconnecter à chaque nouvelle session.
Voici le code de ma fonction login dans l'UsersController :

    public function login()
    {
        if ($this->request->is('post')) {
            $user = $this->Auth->identify();

            if ($user) {
                $this->Auth->setUser($user);

                if ($this->request->data('remember')==1) {
                    $this->Cookie->configKey('User', [
                        'expires' => '+10 days',
                        'httpOnly' => true,
                        'encryption' =>false
                    ]);
                    $this->Cookie->write('User', $this->Auth->user('id') . '---' . sha1($this->Auth->user('username') . $this->Auth->user('password')));
                }

                $this->Flash->set('Vous êtes bien loggé ' . $this->Auth->user('username'), [ 'element' => 'success']);
                return $this->redirect($this->Auth->redirectUrl());
            }
            $this->Flash->error(__('Votre nom d\'utilisateur ou mot de passe est incorrect. Réessayez.'));
        }
    }

Voici le code dans ma fonction beforeFilter dans l'AppController :

```public function beforeFilter(Event $event)
    {

        if (isset($_COOKIE['User']) ) {
            $user = $_COOKIE['User'];
            $user = explode('---', $user);
            $key = sha1($this->Auth->user('username') . $this->Auth->user('password'));
            if ($this->Auth->user('id') == $user[0] && $key == $user[1]) {
                $this->Cookie->configKey('User', [
                    'expires' => '+10 days',
                    'httpOnly' => true,
                    'encryption' =>false
                ]);
                $this->Cookie->write('User', $this->Auth->user('id') . '---' . sha1($this->Auth->user('username') . $this->Auth->user('password')));
            } else {
                $this->Cookie->write('User', '');
            }
        }

        $this->Auth->allow([]);
        $this->Auth->authError = __('You must be logged in to view this page.');
        $this->Auth->loginError = __('Invalid Username or Password entered, please try again.');
    }

Ce que je veux

En fait, le cookie se crée bien, pas de soucis. Lorsque je clique sur logout, il se détruit bien, kusque là je suis content.
Par contre, lorsque je ferme Firefox et reviens sur ma page, le cookie a disparu. Je ne comprends pas très bien d'où vient mon erreur.
Ca fait une heure que je regarde mais je ne vois rien. Any idea ?
En fait, dès que j'affiche la page de login, il me crée le cookie... mais comme il ne connait pas $this->Auth->user('id') au chargement de la page, il crée un "mauvais" cookie.
Je dois avoir mis quelque chose dans le mauvais sens..

2 réponses


Bonjour.
Pour commencer, pourquoi est-ce que tu fais la configuration du Composant Cookie coorespondant à la clé User à chaque fois que tu l'utilise, alors que la configuration est la même les deux fois ?
Il te suffirait de faire la configuration une seule fois dans l'AppController quand tu charges le composant par exemple.
Ensuite, dans ton beforeFilter, tu regardes si le cookie existe, mais avant de vérifier si l'utilisateur est connecté tu utilises le composant Auth, après avoir vérifié si le cookie existe, tu devrais vérifier si l'utilisateur est connecté avant d'utiliser les informations que pourraient te fournir le composant Auth et puis vu que tu part du principe que l'utilisateur est connecté s'il à le cookie, pourquoi est-ce que tu réécris sur le cookie alors qu'il existe déja ?

Cerrer
Auteur

Bonjour Lartak,

Merci pour ta réponse et de tes suggestions.
J'ai fais les changements suggérés --> Cookie User définit une seule fois dans l'AppController.
Concernant le deuxième point, c'est un peu une histoire d'oeuf ou de la poule et je ne vois pas très bien comment vérifier si l'utilisateur est connecté avant d'utiliser le composant Auth.
Concernant le dernier point, je réécris le cookie pour le réinitionaliser, l'écraser. Ainsi, si l'utilisateur se reconnecte avant les 10 jours de délais, le délais est rallongés. Comme ça, même après les 10 jours définis de base, l'utilisateur peut rester connecté plus longtemps. Cela me semblait intéressant.
Bref, là, je bloque. Je vais laisser décanter ça et y revenir dans quelques jours.
Merci.