Laravel中间件重定向循环

时间:2017-11-10 20:10:26

标签: php laravel loops redirect laravel-5

我有一个小小的困境,我正在尝试建立一个登录系统,使用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']);
      });
    

2 个答案:

答案 0 :(得分:0)

guest / RedirectIfAuthenticated 将任何请求重定向到经过身份验证的用户的相应主路由。问题是管理主页路由也是这个中间件的背后,这就是为什么它一直重定向到同一页面。

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

答案 1 :(得分:0)

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

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

`<rewrite>
  <rules>
    <rule name="hide .php extension" stopProcessing="true">
      <match url="^(.*)$" ignoreCase="true" />
    <conditions>
      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
      <add input="{REQUEST_FILENAME}.php" matchType="IsFile" />
    </conditions>
      <action type="Rewrite" url="{R:0}.php" />
    </rule>
  </rules>
</rewrite>`

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

另外修改 web.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');
    }
}