当前位置: 首页 > 知识库问答 >
问题:

Laravel中间件重定向循环

孟彦
2023-03-14

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

主管理控制器-入口控制器:

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

}

登录控制器(默认的一个从auth scaffolding-由我修改,我删除了构造函数):

    namespace App\Http\Controllers\Auth;

    use App\Http\Controllers\Controller;
    use Illuminate\Foundation\Auth\AuthenticatesUsers;

    class LoginController extends Controller
    {
      use AuthenticatesUsers;
      protected $redirectTo = '/home';
    }

中间件(如果重定向验证,则重定向):

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

路由文件(网络路由)

   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个答案

陈扬
2023-03-14

当然,这是一个无限循环,因为您将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']);
});
龚征
2023-03-14

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

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

 类似资料:
  • 我找不到我的谜题。当我加载页面时,chrome会说:localhost页面不工作,localhost重定向了你太多次。我猜这是在创造一个循环。我可能做错了一些我无法得到的事情。这是我的密码。 授权控制器 模型 Authenticate.php config/auth.php

  • 基于此,我在我的应用程序中添加了相同的中间件,结果是重定向循环。 如果用户未通过身份验证,应用程序将重定向到登录页面,因此对我来说,这就是问题所在。也许不是。 ssl证书已正确安装且有效(如果我手动转到https://myapp.org 它按预期工作)。 主要的问题是,我使用整个应用程序的助手url()生成网址,现在我需要重定向到安全的网址。 我尝试删除该中间件,并将重定向添加到.htaccess

  • 我用Laravel 5.6创建了一个简单的身份验证,我试图将登录用户重定向到仪表板,如果他们转到登录页面,并将访客重定向到登录页面,如果他们转到仪表板页面。 我使用laravel默认中间件(重定向): 这是我的路线: 当登录用户尝试访问登录页面时,一切正常,他们重定向到仪表板页面。但是,当来宾尝试访问登录页面时,页面出错:页面没有正确重定向 我到底做错了什么?

  • +++ title = “Redirect 重定向” url = “/middleware/redirect” [menu.side] name = “Redirect 重定向” parent = “middleware” weight = 5 +++ Redirect 中间件 HTTPS 重定向 HTTPS 重定向中间件将 http 请求重定向到 https。例如,http://laily.ne

  • 我想问一下HTTP到HTTPS的重定向。正如我们所知,重定向是通过从web服务器端重定向来实现的。但是,当涉及到https重定向时,它可以通过两种方式完成,服务器端()和应用程序端()。我想知道: 以下哪种方法有效且性能更好。 考虑到同一服务器上的多个域和域,每种方法的优缺点 非常感谢。 参考: 将Laravel中的WWW重定向到非WWW-堆栈溢出

  • 当我在web.php中定义了路由时,我在使用Laravel时遇到了一个路由未定义的错误,如下所示: 我正在从下面的代码重定向到路由 auth()代码可以工作,但当调用重定向时,我得到错误'route[home]not defined'。有没有人知道我怎么解决这个错误。任何帮助都会很好