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