Laravel登录重定向太多次

3
我已经苦苦挣扎了很长一段时间,我的目标是将所有未登录用户访问的URL重定向到登录页面,但它给我返回了以下错误消息,我确定是因为在/login URL上创建了一个循环。身份验证也在登录页面检查授权用户。然而,我希望在检查授权时登录页面应该是一个例外情况。可能是我做错了什么,但我无法理解。以下是我的代码。
routes.php
Route::post('login', 'Auth\AuthController@login');
Route::get('login' , 'Auth\AuthController@showLoginForm');
Route::get('/'     , 'Auth\AuthController@showLoginForm');

kernel.php

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'can' => \Illuminate\Foundation\Auth\Access\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'acl' => \App\Http\Middleware\CheckPermission::class,
];

身份验证类
class Authenticate
{
    public function handle($request, Closure $next, $guard = null) {    
      if (Auth::guard($guard)->guest()) {
        if ($request->ajax() || $request->wantsJson()) {
            return response('Unauthorized.', 401);
        } else {
            return redirect()->guest('login');
        }
      }
    return $next($request);
    }
}

AuthController class

class AuthController extends Controller {

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;
    protected $redirectTo = '/dashboard';
    protected $loginPath = '/login';
    protected $redirectPath = '/dashboard';
public function __construct(){
    $this->middleware('auth', ['except' =>'login']); 
    /* I have been trying these many things to fix this, all in loss.
    // $this->middleware('acl'); // To all methods
    // $this->middleware('acl', ['only' => ['create', 'update']]); 
    // $this->middleware('guest', ['only' => ['/login']]);
    // echo "Message"; exit;
    // $this->middleware('auth');
    // $this->middleware('auth', ['only' => ['login']]);
    // $this->middleware('auth', ['only' => ['/login']]);
    // $this->middleware('auth', ['except' => 'login']);
    // $this->middleware('guest');
    // $this->middleware('guest', ['only' => ['logout' , 'login', '/login', '/']]);
}

请帮我,这些对我来说似乎是某种火箭科学。顺便说一下,我是laravel的新手,可能会做一些愚蠢的事情,为此道歉。谢谢您提前。

6个回答

4
你需要在Laravel路由组之外添加登录路由: routes.php
Route::auth();

Route::group(['middleware' => 'auth'], function () {
  // All route your need authenticated
});

此外,您可以使用以下方式查看路由列表:
php artisan route:list

这应该是被接受的答案。它完全做到了我需要的,简单明了,就像 Laravel 的初衷一样。 - Alex Rindone

3
为什么你要这么做,只是为了将每个未登录用户重定向到登录表单?
我觉得你可以这样做:
Routes.php
  Route::post('login', 'Auth\AuthController@login');
  Route::get('login' , 'Auth\AuthController@showLoginForm');
  Route::get('/'     , 'Auth\AuthController@showLoginForm');

Route::group(['middleware' => 'auth'], function () {

    // any route here will only be accessible for logged in users
 });

认证控制器的构造应该像这样: AuthController
public function __construct()
    {
        $this->middleware('guest', ['except' => 'logout']);
    }

谢谢您的回复,我会在一段时间内尝试这个方法。我明白我之前的做法很混乱,但是您能告诉我在哪里创建了一个循环吗? - ScoRpion
我按照你提到的做了,但是还是出现了同样的错误,没有解决问题。我删除了我的路由并使用了你的路由,也替换了我的AuthController构造函数,但没有成功。 - ScoRpion
在您的授权控制器中更改以下内容:尝试使用$this->middleware('auth', ['except' => 'showLoginForm']);。我认为在构造函数中使用中间件时,必须指定 except 方法名称或仅限制方法名称。因此,您不应该为 showLoginForm 而设置中间件,也不是 login。 - Achraf Khouadja
我搞定了 :) 但是我不知道如何从我的控制器类中移除 $this->middleware('guest'); 并将所有路由添加到你在 routes 中给我的组内。而且它按照我预期的方式工作了。这样做没问题吗,还是我的代码会有一些漏洞.. - ScoRpion
没关系,我给你的这个组和 $this->middleware 做的事情是一样的,在一个类中定义中间件,可以在 routes.php 中定义。 - Achraf Khouadja

2
问题出在你的路由上。
当我输入网址并且没有退出登录时,你会将我发送到登录(get)路由。由于你在AuthController的构造函数中指定了中间件,每次调用AuthController的方法时,都会再次调用构造函数并将你发送回登录页面...这样就会无限循环重复。

1
那么我该如何解决这个问题呢?我知道我做错了什么吗? - ScoRpion

1

就像 @mkmnstr 所说的那样

问题出在你的路由上。 当我登录后没有退出,你会将我发送到登录(get)路由。并且由于你在 AuthController 的构造函数中指定了中间件,每次调用 AuthController 的方法时,都会再次调用构造函数并将你发送回登录界面...这个过程会无限重复。

要解决这个问题,你需要添加

Auth::logout();

这里。
...
} else {
  Auth::logout(); // user must logout before redirect them
  return redirect()->guest('login');
}
...

0
我在创建自己的路由服务提供程序后遇到了同样的问题。问题是,当我尝试登录时,第一次登录页面显示后,在输入凭据后,我遇到了“重定向太多次”的问题,并被重定向到我的管理员仪表板和登录路线! 解决方法是:将中间件“web”添加到我的路由中:
Route::middleware('web')->group(base_path('Admin/routes.php'));

0

如果您正在使用自定义中间件,您必须遵守其所有规则。在我的情况下,我必须在web中间件组中定义一个自定义路由类。在复制粘贴的世界中,有时我们会犯错误。

中间件:


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

        if(!isset(session('user'))){
            return redirect('login');
        }

        return $next($request);
    }
}

Kernel.php 中我的错误
如果在 web 中存在自定义中间件类,则 $middlewareGroups 将检查条件 2 次,因此会出现错误:重定向次数过多

protected $middlewareGroups = [
        'web' => [ 
                 \App\Http\Middleware\webUser::class, //Remove
        ],

protected $routeMiddleware = [ 
      'webUser'=> \App\Http\Middleware\webUser::class //Keepit  
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接