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

时间:2017-11-02 16:47:28

标签: php laravel laravel-5 middleware

我想创建一个自定义中间件,只有在用户通过身份验证且电子邮件是某个电子邮件才能访问/ admin页面时。

虽然,当我指定自定义路线然后重定向时,它总是说太多重定向..

简短说明。

  1. 用户登录 - >重定向到/ home。 (工程)
  2. 如果用户尝试访问/ admin并且他们的电子邮件不像中间件中指定的那样,请重定向到/ home。
  3. 如果是真的,请将它们放入/ admin
  4. 我的中间件名为' admin.verify'

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

    路线档案

    Route::get('/admin', 'AdminController@index')->name('admin.index');
    

    AdminController:

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

1 个答案:

答案 0 :(得分:3)

正如评论中所讨论的,您已在全局中间件堆栈下注册了该堆栈,该堆栈在每个请求上运行。这意味着,如果第一个条件失败,您将不断重定向到“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,可以在特定路由上启用的路由特定中间件。