【问题标题】:Laravel middleware redirect loopLaravel 中间件重定向循环
【发布时间】:2018-04-24 03:10:22
【问题描述】:

我有一个小难题,我正在尝试制作一个登录系统,使用 laravel auth 脚手架将普通用户与管理员用户区分开来。

问题在于它进入了中间件中的无限重定向循环。

按下登录按钮后,它会不断重定向到一条路线,问题是,我如何通过“laravel 方式”或任何其他方式解决此问题。

这是我的控制器: 1.基本的家庭控制器:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
   /**
   * Show the application dashboard.
   *
   * @return \Illuminate\Http\Response
   */
  public function index()
  {
    return view('home');
  }
}
  1. 主管理控制器 - 入口控制器:

     namespace App\Http\Controllers\Admin;
    
     use Illuminate\Http\Request;
     use App\Http\Controllers\Controller;
    
     class Start extends Controller
     {
    
      public function index(){
    
        return view('admin/index');
      }
    
    }
    
  2. 登录控制器(auth 脚手架中的默认控制器-由我修改,我删除了构造函数):

        namespace App\Http\Controllers\Auth;
    
        use App\Http\Controllers\Controller;
        use Illuminate\Foundation\Auth\AuthenticatesUsers;
    
        class LoginController extends Controller
        {
          use AuthenticatesUsers;
          protected $redirectTo = '/home';
        }
    
  3. 中间件(如果 RedirectIfAuthenticated 则重定向):

            namespace App\Http\Middleware;
    
            use Closure;
            use Illuminate\Support\Facades\Auth;
    
            class RedirectIfAuthenticated
            {
               public function handle($request, Closure $next, $guard = null)
              {
                if (Auth::guard($guard)->check()) {
                  if(Auth::user()->type == 2){//if user type is 1 then it's an admin.
                   return redirect()->route('web-admin');
                  }else{
                    return redirect()->route('home');
                 }
              }
            return $next($request);
          }
        }
    
  4. 路由文件(网络路由)

       Route::get('/', function () {
         return view('index');
       });
    
       Auth::routes();
       Route::middleware(['auth','guest'])->group(function() {
       Route::get('home',['as'=>'home', 'uses'=>'HomeController@index']);
       Route::get('web-admin',['as'=>'web-admin', 'uses'=>'Admin\Start@index']);
      });
    

【问题讨论】:

    标签: php laravel loops redirect laravel-5


    【解决方案1】:

    肯定这是一个无限循环,因为您将 guest 和 auth 中间件应用到您的路由中,因此经过身份验证的用户也将被重定向,这是一个无限循环。

    RedirectIfAuthenticated.php 保留为其原始代码,并根据用户类型在主控制器内重定向经过身份验证的用户:

    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    
    class HomeController extends Controller
    {
        /**
        * Show the application dashboard.
        *
        * @return \Illuminate\Http\Response
        */
        public function index(Request $request)
        {
            // if type 1 is admin, why did you redirect type 2 to web-admin?!
            if($request->user()->type == 2) { //if user type is 1 then it's an admin.
                return redirect()->route('web-admin');
            }
            return view('home');
        }
    }
    

    您可以在您的管理控制器中为普通用户执行相同的重定向,以便在他们尝试访问管理页面时将他们重定向回来。

    另外修改web.php路由如下:

    Route::get('/', function () {
        if(auth()->user()->type == 2) { //if user type is 1 then it's an admin.
            return redirect()->route('web-admin');
        } else {
            return redirect()->route('home');
        }
    })->middleware('auth');
    
    Auth::routes();
    Route::middleware('auth')->group(function() {
        Route::get('home',['as'=>'home', 'uses'=>'HomeController@index']);
        Route::get('web-admin',['as'=>'web-admin', 'uses'=>'Admin\Start@index']);
    });
    

    【讨论】:

    • 这是一个关于用户类型的错字,类型 2 是管理员
    • 这样你最终会有多个重定向。首先从中间件到home,然后从HomeController 到web-admin
    • 不。中间件只是将经过身份验证的用户重定向到“/”,以防他们尝试访问登录页面
    【解决方案2】:

    guest/RedirectIfAuthenticated 将任何请求重定向到经过身份验证的用户的相应家乡路由。问题是管理员主页路由也在这个中间件后面,这就是它不断重定向到同一页面的原因。

    您需要从路由组中删除 guest 中间件 - 它应该只应用于应该仅供未经身份验证的用户使用的路由。

    【讨论】:

    • 是的。从登录路由中删除访客中间件会停止重定向。谢谢。
    猜你喜欢
    • 2020-02-19
    • 1970-01-01
    • 2018-05-28
    • 2016-03-16
    • 2017-02-11
    • 2014-06-02
    • 2015-05-16
    • 2015-08-04
    • 2015-03-17
    相关资源
    最近更新 更多