web-dev-qa-db-fra.com

Empêcher la connexion du bouton Précédent du navigateur après la déconnexion Laravel 5

Je suis nouveau sur Laravel 5 et j'essaie de créer une page d'authentification simple. Mon problème est que je peux me déconnecter correctement après avoir cliqué sur le lien de déconnexion, mais si je clique sur le bouton de retour du navigateur, je peux toujours pour voir le contenu de la page qui ne devrait pas être vu en ce qui concerne mon processus d'authentification middleware. J'ai lu que je peux empêcher cela en désactivant la mise en cache mais ne pense pas que c'est la meilleure façon de le faire alors comment puis-je le faire dans un meilleur moyen? Mon itinéraire de déconnexion est simplement

Route::get('logout', array('uses' => 'LoginController@logout'));

La fonction de déconnexion est:

public function logout() {
        Auth::logout(); // logout user
        Session::flush();
        Redirect::back();
        return Redirect::to('pages/login'); //redirect back to login
}
18
Tartar

Lorsque l'utilisateur clique sur le bouton de retour, il est pas réellement connecté, c'est juste le navigateur qui rend ce qu'il a mis en cache de vues des pages précédentes. L'utilisateur ne veut pas peut naviguer ou interagir avec tout ce qui nécessite qu'il soit connecté car, à votre application sur le serveur, il n'est pas authentifié.

Lorsque l'utilisateur clique sur bouton retour vous n'avez aucun contrôle sur cela car il ne fait pas de demande au serveur.

En utilisant le bouton de retour, le seul contenu qu'ils pourront voir est celui qu'ils ont déjà visité en se connectant. S'ils essaient d'accéder à quelque chose de nouveau, ils feront une nouvelle demande à votre application, votre middleware se déclenchera et redirigez-les vers la page de connexion.

Je suppose que si vous vouliez vraiment arrêter ce comportement, vous pourriez utiliser du JavaScript et autres pour envoyer une demande ajax et vérifier si l'utilisateur est connecté de cette façon, mais tout à fait inutile du point de vue de la sécurité.

32
Wader

Créer un middleware en utilisant artisan:

php artisan make:middleware RevalidateBackHistory

Dans le middleware RevalidateBackHistory, nous définissons l'en-tête sur no-cache et revalidate:

<?php
namespace App\Http\Middleware;
use Closure;
class RevalidateBackHistory
{
    /**
    * Handle an incoming request.
    *
    * @param \Illuminate\Http\Request $request
    * @param \Closure $next
    * @return mixed
    */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        return $response->header('Cache-Control','nocache, no-store, max-age=0, must-revalidate')
            ->header('Pragma','no-cache')
            ->header('Expires','Fri, 01 Jan 1990 00:00:00 GMT');
    }
}

Mettez à jour le middleware de routage de l'application dans Kernel.php:

protected $routeMiddleware = [
    .
    .
    'revalidate' => \App\Http\Middleware\RevalidateBackHistory::class,
    .
    .
];

Et c'est tout! Donc, en gros, il vous suffit d'appeler le middleware revalidate pour les routes qui nécessitent une authentification utilisateur.

42
RaZik

Étape 1: créez un middleware à l'aide de la commande suivante:

php artisan make:middleware PreventBackHistory

Étape 2:

remplacer le contenu de PreventBackHistory.php par le contenu suivant:

<?php

namespace App\Http\Middleware;

use Closure;

class PreventBackHistory
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        return $response->header('Cache-Control','no-cache, no-store, max-age=0, must-revalidate')
            ->header('Pragma','no-cache')
            ->header('Expires','Sun, 02 Jan 1990 00:00:00 GMT');
    }
}

étape 3: enregistrer le middleware dans kernal.php

'preventBackHistory' => \App\Http\Middleware\PreventBackHistory::class,

Et bon pour aller :)

15
Payal

Une méthode que j'ai utilisée consiste à simplement rediriger vers la page précédente après la déconnexion. Tant que la page précédente a été sécurisée, le middleware d'authentification se déclenchera et vous redirigera vers la page de connexion. Maintenant, lorsque vous cliquez sur le bouton Précédent, la page précédente n'est plus mise en cache et vous obtenez à nouveau la page de connexion.

Discussion originale: https://laracasts.com/discuss/channels/requests/back-button-browser

public function logout() {
        Auth::logout(); // logout user
        return redirect(\URL::previous());
}
10
sitesense

Vous pouvez remplacer la méthode de déconnexion dans votre trait AuthenticatesUsers comme:

public function logout(Request $request)
    {
        $this->guard()->logout();
        $request->session()->invalidate();
        return $this->loggedOut($request) ?: redirect()->back();
    }
1
Nadim

Essayez de rediriger vers un itinéraire protégé avec auth middleware:

return redirect('home');

donc il forcera la redirection vers la page de connexion et le bouton de retour ne montrera pas la page précédente

0
emonik