Laravel 注销,点击后退按钮让我回到应用程序,我该如何防止这种情况
Laravel logout, hittin gthe back button send s me back into the app, how do I prevent this
目前我使用默认的 laravel login/auth 控制器、路由、视图并且没有自定义逻辑。我们正在构建一个应用程序,如果您注销并单击后退按钮,在任何情况下都不能 "be taken back into the app, even if you have no session."
有没有办法在您注销后点击后退按钮,而不是让您返回应用程序?就像您单击后退按钮后我们无法显示任何内容一样。它应该进入 laravel 错误屏幕或自动将您送回登录。
我所有的控制器都有 $this->middleware('auth');
,它应该会自动将您重新发送回登录屏幕。
您可以使用路由组轻松地通过路由 class 中的 auth 中间件路由所有流量:
Auth::routes(); // exclude auth route from being guarded
Route::group(['middleware' => 'auth'], function()
{
// add all your routes here
Route::get('/',function (){
return view('welcome);
});
});
编辑 1:
为防止用户使用缓存版本,请查看本文
https://twitteinfo.com/laravel-5-how-to-prevent-browser-back-button-after-user-logout/
经过大量测试,我发现唯一的解决方案是在所有 'secure' 页面的响应中强制使用 no-store header,这样浏览器就不会缓存它。在慢速网络上,这可能会给页面加载增加一个小的延迟。它只影响返回的响应,页面加载的资产的 none 受到影响。它们仍然可以被缓存。
使用 php artisan make:middleware NoCacheHeaders
创建一个新的中间件
按照下面的建议进行编辑
<?php
namespace App\Http\Middleware;
use Closure;
class NoCacheHeaders
{
/**
* Add set no caching HTTP headers.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|array $options
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws \InvalidArgumentException
*/
public function handle($request, Closure $next, $options = [])
{
$response = $next($request);
$response->header('Expires', 'Fri, 01 Jan 1990 00:00:00 GMT');
$response->header('Cache-Control', 'no-cache, must-revalidate, no-store, max-age=0, private');
return $response;
}
}
将此中间件添加到 routeMiddleware
部分的 \App\Http\Kernel.php
'nocache' => \App\Http\Middleware\NoCacheHeaders::class,
中间件 nocache
现在可以添加到组或单个路由中。我添加到所有受 auth
保护的路由
//protected routes (must be logged in)
Route::middleware(['auth','nocache'])->group(function(){
Route::get('/home', 'HomeController@index')->name('home');
Route::name('admin.')->group(function () {
Route::resource('admin/users','Admin\UserController');
Route::resource('admin/roles','Admin\RoleController');
});
});
现在,查看受保护的页面后,退出并返回,之前的页面不会显示。
如果您只是想阻止使用后退按钮,而不关心用户是否可以按住后退按钮并转到前面的页面,则以下内容会禁用后退按钮。
(当然你可以同时使用禁用缓存和禁用后退按钮)
创建一个新的 'Logged out' 视图
这是可选的,但意味着您可以添加 javascript 而不必担心影响任何其他功能。
@extends('layouts.app',[$title='Logout | '])
@section('content')
<div class="container mx-auto">
<div class="flex flex-wrap justify-center">
<div class="w-full max-w-md">
<h1 class="text-2xl text-gray-700 text-center">You have been successfully logged out</h1>
<p class='mt-8 text-xl text-indigo-800 text-center underline'><a href="{{ route('login') }}">Login?</a></p>
<script type="text/javascript">
history.pushState(null, null, `{{ route('logout') }}`);
window.addEventListener('popstate', function () {
history.pushState(null, null, `{{ route('logout') }}`);
});
</script>
</div>
</div>
</div>
@endsection
创建一个路由来显示注销页面
Route::view('/logout','auth.logout')->name('logout');
修改登录控制器以转到注销视图
在App\Http\Controllers\Auth\LoginController.php
的某处添加以下代码
private function loggedOut($request)
{
return redirect(route('logout'));
}
目前我使用默认的 laravel login/auth 控制器、路由、视图并且没有自定义逻辑。我们正在构建一个应用程序,如果您注销并单击后退按钮,在任何情况下都不能 "be taken back into the app, even if you have no session."
有没有办法在您注销后点击后退按钮,而不是让您返回应用程序?就像您单击后退按钮后我们无法显示任何内容一样。它应该进入 laravel 错误屏幕或自动将您送回登录。
我所有的控制器都有 $this->middleware('auth');
,它应该会自动将您重新发送回登录屏幕。
您可以使用路由组轻松地通过路由 class 中的 auth 中间件路由所有流量:
Auth::routes(); // exclude auth route from being guarded
Route::group(['middleware' => 'auth'], function()
{
// add all your routes here
Route::get('/',function (){
return view('welcome);
});
});
编辑 1: 为防止用户使用缓存版本,请查看本文 https://twitteinfo.com/laravel-5-how-to-prevent-browser-back-button-after-user-logout/
经过大量测试,我发现唯一的解决方案是在所有 'secure' 页面的响应中强制使用 no-store header,这样浏览器就不会缓存它。在慢速网络上,这可能会给页面加载增加一个小的延迟。它只影响返回的响应,页面加载的资产的 none 受到影响。它们仍然可以被缓存。
使用 php artisan make:middleware NoCacheHeaders
按照下面的建议进行编辑
<?php
namespace App\Http\Middleware;
use Closure;
class NoCacheHeaders
{
/**
* Add set no caching HTTP headers.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|array $options
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws \InvalidArgumentException
*/
public function handle($request, Closure $next, $options = [])
{
$response = $next($request);
$response->header('Expires', 'Fri, 01 Jan 1990 00:00:00 GMT');
$response->header('Cache-Control', 'no-cache, must-revalidate, no-store, max-age=0, private');
return $response;
}
}
将此中间件添加到 routeMiddleware
部分的 \App\Http\Kernel.php
'nocache' => \App\Http\Middleware\NoCacheHeaders::class,
中间件 nocache
现在可以添加到组或单个路由中。我添加到所有受 auth
//protected routes (must be logged in)
Route::middleware(['auth','nocache'])->group(function(){
Route::get('/home', 'HomeController@index')->name('home');
Route::name('admin.')->group(function () {
Route::resource('admin/users','Admin\UserController');
Route::resource('admin/roles','Admin\RoleController');
});
});
现在,查看受保护的页面后,退出并返回,之前的页面不会显示。
如果您只是想阻止使用后退按钮,而不关心用户是否可以按住后退按钮并转到前面的页面,则以下内容会禁用后退按钮。
(当然你可以同时使用禁用缓存和禁用后退按钮)
创建一个新的 'Logged out' 视图
这是可选的,但意味着您可以添加 javascript 而不必担心影响任何其他功能。
@extends('layouts.app',[$title='Logout | '])
@section('content')
<div class="container mx-auto">
<div class="flex flex-wrap justify-center">
<div class="w-full max-w-md">
<h1 class="text-2xl text-gray-700 text-center">You have been successfully logged out</h1>
<p class='mt-8 text-xl text-indigo-800 text-center underline'><a href="{{ route('login') }}">Login?</a></p>
<script type="text/javascript">
history.pushState(null, null, `{{ route('logout') }}`);
window.addEventListener('popstate', function () {
history.pushState(null, null, `{{ route('logout') }}`);
});
</script>
</div>
</div>
</div>
@endsection
创建一个路由来显示注销页面
Route::view('/logout','auth.logout')->name('logout');
修改登录控制器以转到注销视图
在App\Http\Controllers\Auth\LoginController.php
private function loggedOut($request)
{
return redirect(route('logout'));
}