Zablokuj przycisk Wstecz przeglądarki logowanie po wylogowaniu w Laravel 5

Jestem nowy w Laravel 5 i staram się zrobić prostą stronę uwierzytelniania. Mój problem polega na tym, że mogę wylogować się poprawnie po kliknięciu linku wylogowania, ale jeśli kliknę przycisk Wstecz przeglądarki, nadal mogę zobaczyć zawartość strony, która faktycznie nie powinna być widoczna w odniesieniu do mojego procesu pośredniczącego auth. Przeczytałem, że mogę temu zapobiec, wyłączając buforowanie, ale nie sądzę, że jest to najlepszy sposób, aby to zrobić, więc jak Mogę to zrobić w lepszy sposób ? Po prostu Moja trasa wylogowania is

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

Funkcja wylogowania to:

public function logout() {
        Auth::logout(); // logout user
        Session::flush();
        Redirect::back();
        return Redirect::to('pages/login'); //redirect back to login
}
Author: Tartar, 2015-05-08

9 answers

Kiedy użytkownik kliknie przycisk Wstecz, są nie rzeczywiście zalogowani, to tylko przeglądarka renderuje to, co ma buforowane z poprzednich odsłon strony. Użytkownik nie będzie w stanie nawigować ani wchodzić w interakcje ze wszystkim, co wymaga od niego zalogowania, ponieważ w aplikacji na serwerze nie jest uwierzytelniony.

Gdy użytkownik kliknie przycisk Wstecz nie masz nad tym kontroli, ponieważ nie wysyła żądania do Serwer .

Używając przycisku Wstecz, jedyną zawartością, którą będą mogli zobaczyć, jest to, co już odwiedzili, gdy byli zalogowani. Jeśli spróbują uzyskać dostęp do czegokolwiek nowego, złożą nowe żądanie do Twojej aplikacji, oprogramowanie pośredniczące uruchomi je i przekieruje na stronę logowania.

Myślę, że jeśli naprawdę chcesz zatrzymać to zachowanie można użyć trochę JavaScript i takie do wysłania żądania ajax i sprawdzić, czy użytkownik jest zalogowany w ten sposób, ale dość bezużyteczny z zabezpieczeń punkt widzenia.

 43
Author: Wader,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-18 14:53:51

[[3]}Utwórz oprogramowanie pośredniczące przy użyciu artisan:

php artisan make:middleware RevalidateBackHistory

W oprogramowaniu pośredniczącym RevalidateBackHistory ustawiamy nagłówek na no-cache i rewalidujemy:

<?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');
    }
}

Zaktualizuj route middleware aplikacji w jądrze.php:

protected $routeMiddleware = [
    .
    .
    'revalidate' => \App\Http\Middleware\RevalidateBackHistory::class,
    .
    .
];
I to wszystko! Więc w zasadzie wystarczy wywołać revalidate middleware dla tras, które wymagają uwierzytelnienia użytkownika.
 57
Author: RaZik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-30 11:31:26

Krok 1: Utwórz jedną middleware używając następującego polecenia:

php artisan make:middleware PreventBackHistory

Krok 2:

Zastąp zawartość PreventBackHistory.php o następującej treści:

<?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');
    }
}

Krok 3: zarejestruj oprogramowanie pośredniczące w kernal.php

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

I gotowe:)

 21
Author: Payal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 22:59:41

Metodą, której użyłem, jest po prostu przekierowanie do poprzedniej strony po wylogowaniu. Tak długo, jak poprzednia strona była zabezpieczona, oprogramowanie pośredniczące auth uruchomi się i przekieruje Cię z powrotem do strony logowania. Teraz po kliknięciu przycisku Wstecz Poprzednia strona nie jest już buforowana i po prostu ponownie pojawi się strona logowania.

Original dyskusja: https://laracasts.com/discuss/channels/requests/back-button-browser

public function logout() {
        Auth::logout(); // logout user
        return redirect(\URL::previous());
}
 10
Author: sitesense,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-05 15:25:08

Tak, to tylko zachowanie przeglądarki, nie żaden problem ze strony Laravela, ale może to być problem z bezpieczeństwem. Oto jak to rozwiązałem,

  1. Tworzenie nowego middleware

PHP artisan make: middleware PreventBackHistory

  1. Replace middleware function handle
    $response = $next($request);
    $response->headers->set('Cache-Control','nocache, no-store, max-age=0, must-revalidate');
    $response->headers->set('Pragma','no-cache');
    $response->headers->set('Expires','Sun, 02 Jan 1990 00:00:00 GMT');
    return $response;
  1. Include path in Kernal

'prevent-back-history' => \App \ Http \ Middleware\PreventBackHistory:: class

  1. Update Trasy

Route:: group(['middleware' => ['prevent-back-history', 'otherMiddlewares']]

To zadziała dla Ciebie!
 1
Author: Maha Dev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-23 08:39:17

Możesz nadpisać metodę wylogowania w swojej cechy AuthenticatesUsers jako:

public function logout(Request $request)
    {
        $this->guard()->logout();
        $request->session()->invalidate();
        return $this->loggedOut($request) ?: redirect()->back();
    }
 0
Author: Nadim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-02 05:20:58

Using this <a href={{$_SERVER['HTTP_REFERER']}}>back</a> przydaje się.

 0
Author: Isma'el,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-25 11:36:36

To pytanie zostało uznane za rozwiązane, ale chciałbym umieścić rozwiązanie, które znalazłem i pracował dla mnie, ponieważ jak wyjaśnił Jeff Adams w komentarzu poniżej wybranej odpowiedzi, ktoś inny może być w stanie zobaczyć sensowne informacje na stronach odwiedzanych przez użytkownika przed wylogowaniem, duży problem bezpieczeństwa moim zdaniem.

Używam apache, więc dodałem następujące nagłówki do mojego publicznego/.htaccess:

  • Header set Cache-Control " no-cache, no-store, must-rewalidate "
  • Header set Pragma "no-cache"
  • header set Expires 0

Bardziej ogólnym sposobem byłoby dodanie meta tagów do twojego HTML:

  • <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
  • <meta http-equiv="Pragma" content="no-cache" />
  • <meta http-equiv="Expires" content="0" />

Możesz znaleźć to, co najlepiej pasuje do Twojej aplikacji tutaj: https://cristian.sulea.net/blog/disable-browser-caching-with-meta-html-tags/

 0
Author: Orlando Tejeda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-11 17:08:23

Spróbuj przekierować na chronioną trasę za pomocą auth middleware:

return redirect('home');

Więc wymusi przekierowanie na stronę logowania , a przycisk Wstecz nie pokaże poprzedniej strony

 -1
Author: emonik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-20 11:32:04