Php 自定义中间件-重定向太多-Laravel

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

我想创建一个自定义中间件,仅当用户经过身份验证并且电子邮件是访问/admin页面的特定电子邮件时,该中间件才可用

虽然,当我指定自定义路由和重定向时,它总是说重定向太多

简短解释。

 public function handle($request, Closure $next)
    {

      if (Auth::check() && Auth::User()->email == 'Tester@gmail.com') {
        return $next($request);
      } else {
        return redirect()->route('home');
      }
  • 用户登录->重定向到/home。(工程)
  • 如果用户试图访问/admin,并且他们的电子邮件与中间件中指定的电子邮件不同,请重定向到/home
  • 如果是真的,请让他们输入/admin
  • 我的中间件名为“admin.verify”

    Routes文件会自动加载,如果我重定向('/home'),它会自动运行我的中间件,这就是为什么我猜它会经常重定向到homepage

    路由文件:

    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上使用了它!非常感谢。