Bonjour,

Je souhaite crée un middleware qui redirige l'utilisateur à la page de login si il effectue une action alors qu'il n'est pas connecté. Puis une fois connecté fini l'action qu'il étais en train de faire.

Exemple:
L'utilisateur non connecté écrie son commentaire.
Il est redirigé vers la page de login.
Une fois connecté l'action est fini.

Ce que je fais

    public function handle($request, Closure $next)
    {
        if (Auth::guest()) {
            return redirect()->guest(route('login'));
        }
        return $next($request);
    }

Ce que j'obtiens

L'utilisateur est bien redirigé vers l'uri sauf qu'il na pas le même type de requet elle passe de get à post.

Merci par avance de votre aide

7 réponses


Il existe déjà le middleware Auth inclu dans Laravel.

Oui, mais il ne redirige pas avec les données comme un commentaire.

Lorsque tu envoies un commentaire en POST, tu stockes les donnés envoyées en GET ou dans la session puis une fois connecté, tu regardes dans le LOGINCONTROLLER si il y a des donnés et tu effectues l'action souhaitée ensuite. Sache que tu peux également bloquer l'envoie de commentaire dans le front en indiquant qu'une connection est requise.

Je n'ai pas opté pour cette solution que je trouve brouillon. Pour ce qui est de bloquer l'utilisateur je ne trouve pas cette option moins attirante pour l'utilisateur.

Tu peux faire une solution pas très très propre, mais fonctionnelle. Reproduire le middleware Auth, mais dans ta redirection tu inclus les données de POST

return redirect()->guest(route('login'))->withInputs();

Et durant la connexion tu le rediriges sur l'ancienne page toujours avec les inputs.

Autre technique, tu affiches le formulaire de connexion, à la place du formulaire d'action, tu réalises la connexion en ajax, et si la connexion est bonne tu affiches le formulaire souhaité.

J'ai vu sa : https://stackoverflow.com/questions/15389833/laravel-redirect-back-to-original-destination-after-login
Le truc c'est qu'il redirige vers la bonne destination mais sans les inputs et n'y le bon type derequête post -> get.

Comme dit plus haut...

->withInputs();