Laravel 登录重定向您的次数过多

Posted

技术标签:

【中文标题】Laravel 登录重定向您的次数过多【英文标题】:Laravel login redirected you too many times 【发布时间】:2016-10-15 16:06:57 【问题描述】:

我现在一直在努力解决这个问题,我正在尝试将未登录用户点击的所有 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 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 的新手,可能正在做一些愚蠢的事情,为此道歉。提前致谢。

【问题讨论】:

【参考方案1】:

为什么你做这一切只是为了将每个未登录的用户重定向到登录表单?

我认为你可以这样做

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

auth 控制器结构应该是这样的

AuthController

public function __construct()
    
        $this->middleware('guest', ['except' => 'logout']);
    

【讨论】:

感谢您的回复,我会在一段时间内尝试这个,我知道我做的很乱,但是你能告诉我我在哪里创建了一个循环。 我做了你提到的,它给了我同样的错误,它没有解决问题。我删除了我的路线并放了你的路线,还替换了我的 AuthController 构造函数,但没有运气.. 在您的身份验证控制器中更改这个 试试这个$this->middleware('auth', ['except' => 'showLoginForm']); 我认为在构造函数中使用中间件时,您必须为期望或仅指定方法名称,因此您不应该为Showlogin for and not login 我让它工作了 :) 但我不知道如何删除 $this->middleware('guest');来自我的 ctrl 类,并将我的所有路线添加到您发送给我的路线组中。它按我的预期工作。可以吗,否则我的代码中会有一些漏洞.. 没关系,我给你的组和 $this->middlware 做同样的事情,而是在一个类中定义一个中间件,在 routes.php 中定义它【参考方案2】:

问题在于你的路线。

当我进入并且我没有注销时,您将我发送到登录(获取)路线。并且当您在 AuthController 的构造函数中指定中间件时,每次调用 AuthController 的方法时,都会再次调用构造函数并在登录时将您发送回......并且它会无限重复。

【讨论】:

那么我该如何解决这个问题,我知道我做错了什么?【参考方案3】:

你需要在 Laravel 组外添加路由登录:

routes.php

Route::auth();

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

此外,您可以使用以下方式查看您的路线列表:

php artisan route:list

【讨论】:

这应该是公认的答案。它完全符合我的要求,干净而简单,就像 laravel 的本意一样。【参考方案4】:

喜欢@mkmnstr 说

问题在于您的路线。 当我进入并且我没有注销时,您将我发送到登录(获取)路线。并且当您在 AuthController 的构造函数中指定中间件时,每次调用 AuthController 的方法时,都会再次调用构造函数并在登录时将您发送回......并且它会无限重复。

解决你应该添加的问题

Auth::logout();

这里

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

...

【讨论】:

【参考方案5】:

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

中间件


 public function handle($request, Closure $next)
    

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

        return $next($request);
    

我在 Kernel.php 中的错误 如果 web $middlewareGroups 中存在的自定义中间件类将检查条件 2 次,则会给出错误:redirect you too many times

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

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

【讨论】:

以上是关于Laravel 登录重定向您的次数过多的主要内容,如果未能解决你的问题,请参考以下文章

spring boot项目在eclipse里跑可以访问登录页,但是打jar包后访问登录页报重定向次数过多

求助求助,着急呀,网站出现重定向次数过多怎么办

我在中间件上做了一些更改,Laravel重定向次数太多次才能登录

cas单点登录后重定向次数过多问题以及调试cas-dot-net-client

cas单点登录后重定向次数过多问题以及调试cas-dot-net-client

遇到的一个重定向次数过多的问题