Php 自定义中间件-重定向太多-Laravel
我想创建一个自定义中间件,仅当用户经过身份验证并且电子邮件是访问/admin页面的特定电子邮件时,该中间件才可用 虽然,当我指定自定义路由和重定向时,它总是说重定向太多 简短解释。Php 自定义中间件-重定向太多-Laravel,php,laravel,laravel-5,middleware,Php,Laravel,Laravel 5,Middleware,我想创建一个自定义中间件,仅当用户经过身份验证并且电子邮件是访问/admin页面的特定电子邮件时,该中间件才可用 虽然,当我指定自定义路由和重定向时,它总是说重定向太多 简短解释。 public function handle($request, Closure $next) { if (Auth::check() && Auth::User()->email == 'Tester@gmail.com') { return $next
public function handle($request, Closure $next)
{
if (Auth::check() && Auth::User()->email == 'Tester@gmail.com') {
return $next($request);
} else {
return redirect()->route('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');
}
}
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');
}
}
管理员控制器:
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');
}
}
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');
}
}
我的家乡路线:
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');
}
}
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');
}
}
主控台:
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');
}
}
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');
}
}
正如在评论中所讨论的,您已经在全局中间件堆栈下注册了它,该堆栈在每个请求上运行。这意味着,如果第一个条件失败,您将不断重定向到“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,全局中间件堆栈(在每个请求上运行)
$middlewareGroup,在组的每个请求(web、api等)上运行。routes/web.php中的任何内容都将通过“web”组运行
$routeMiddleware,可在特定路由上启用的路由特定中间件。您正在将未经身份验证的用户重定向到需要身份验证的路由。您可能需要另一个案例来将来宾重定向到其他地方。@apokryfos在我指定的AdminController中使用“auth”中间件。因此,必须对用户进行身份验证。您的中间件在Kernel.php的堆栈中的顺序是什么?@Devon'auth'是第一个,而'admin.verify'是最后一个。您的意思是在主路由上得到一个无休止的重定向循环吗?如果是这种情况,您可能会在全局堆栈或web堆栈下注册此中间件。你只需要在路由中间件下使用这个中间件。2天的挣扎都是因为我在Global上使用了它!非常感谢。