自定义中间件 - 重定向过多 - Laravel
Custom Middleware - Too Many Redirects - Laravel
我想创建一个自定义中间件,只有当用户通过身份验证并且电子邮件是特定电子邮件才能访问/admin 页面。
虽然,当我指定我的自定义路由然后重定向时,它总是说重定向太多..
简短说明。
- 用户登录 -> 重定向到 /home。 (作品)
- 如果用户尝试访问 /admin 并且他们的电子邮件与中间件中指定的不同,则重定向到 /home。
- 如果是真的,让他们进入/admin
我的中间件叫做'admin.verify'
路由文件会自动加载,如果我执行 redirect('/home') 它会自动运行我的中间件,这就是我猜测它过于频繁地重定向到主页的原因。
路由文件:
Route::get('/admin', 'AdminController@index')->name('admin.index');
管理员控制器:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class AdminController extends Controller
{
public function __construct(){
$this->middleware(['auth', 'admin.verify']);
}
public function index(){
return view('admin.test');
}
}
中间件:
public function handle($request, Closure $next)
{
if (Auth::check() && Auth::User()->email == 'Tester@gmail.com') {
return $next($request);
} else {
return redirect()->route('home');
}
我的家乡路线:
GET|HEAD | home | home| App\Http\Controllers\HomeController@index | web,auth
家庭控制器:
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('home');
}
}
正如评论中所讨论的,您已经在全局中间件堆栈下注册了它,每个请求都会 运行s。意思是,如果第一个条件失败,您将不断重定向到 'home',因为此中间件将在 'home'(以及所有其他)路由上成为 运行。所以你会去:
/some/page ... condition failed: redirect 'home'
/home ... condition failed: redirect 'home'
/home ... condition failed: redirect 'home' ... and so on
在 app/Http/Kernel.php 中,您有三个部分:
$middleware,全局中间件堆栈(每个请求 运行s)
$middlewareGroup,运行s 对组的每个请求(web、api 等)。 routes/web.php 中的任何内容都将 运行 通过 'web' 组。
$routeMiddleware,可在特定路由上启用的路由特定中间件。
我想创建一个自定义中间件,只有当用户通过身份验证并且电子邮件是特定电子邮件才能访问/admin 页面。
虽然,当我指定我的自定义路由然后重定向时,它总是说重定向太多..
简短说明。
- 用户登录 -> 重定向到 /home。 (作品)
- 如果用户尝试访问 /admin 并且他们的电子邮件与中间件中指定的不同,则重定向到 /home。
- 如果是真的,让他们进入/admin
我的中间件叫做'admin.verify'
路由文件会自动加载,如果我执行 redirect('/home') 它会自动运行我的中间件,这就是我猜测它过于频繁地重定向到主页的原因。
路由文件:
Route::get('/admin', 'AdminController@index')->name('admin.index');
管理员控制器:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class AdminController extends Controller
{
public function __construct(){
$this->middleware(['auth', 'admin.verify']);
}
public function index(){
return view('admin.test');
}
}
中间件:
public function handle($request, Closure $next)
{
if (Auth::check() && Auth::User()->email == 'Tester@gmail.com') {
return $next($request);
} else {
return redirect()->route('home');
}
我的家乡路线:
GET|HEAD | home | home| App\Http\Controllers\HomeController@index | web,auth
家庭控制器:
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('home');
}
}
正如评论中所讨论的,您已经在全局中间件堆栈下注册了它,每个请求都会 运行s。意思是,如果第一个条件失败,您将不断重定向到 'home',因为此中间件将在 'home'(以及所有其他)路由上成为 运行。所以你会去:
/some/page ... condition failed: redirect 'home'
/home ... condition failed: redirect 'home'
/home ... condition failed: redirect 'home' ... and so on
在 app/Http/Kernel.php 中,您有三个部分:
$middleware,全局中间件堆栈(每个请求 运行s)
$middlewareGroup,运行s 对组的每个请求(web、api 等)。 routes/web.php 中的任何内容都将 运行 通过 'web' 组。
$routeMiddleware,可在特定路由上启用的路由特定中间件。