使用自定义中间件会将我重定向到 /home,即使 Laravel 中的中间件是空的
Posted
技术标签:
【中文标题】使用自定义中间件会将我重定向到 /home,即使 Laravel 中的中间件是空的【英文标题】:Using a custom middleware redirects me to /home, even if middleware is empty in Laravel 【发布时间】:2017-09-25 03:31:28 【问题描述】:我现在完全没有任何想法。
案例是:我有一个 API 端点的路由(工作正常,响应 JSON 等)。
如果我现在将内置的 'auth' 中间件应用到路由,我总是被重定向到 /home 路由。看来我在做某事。身份验证错了吗?我想错了,因为:
如果我不使用 'auth' 而是使用自定义中间件,这个奇怪的重定向也会起作用,它不包含任何东西
public function handle($request, Closure $next)
print "WTF";
throw new AuthenticationException('Unauthenticated.');
[永远不会抛出打印和异常!我在 /home 再次登陆,没有错误。]
并非所有中间件都会产生此错误:例如,“auth.basic”和“web”在此路由上运行良好。
根据我发现的一些结果,我还将“web”和我自己的中间件都应用于路由,也就是说使用“web”为他们解决了类似的问题,但你猜怎么着,没有任何改变。
TL:DR:如果我使用自己的中间件或“身份验证”,我会被重定向,在中间件本身执行之前。
更新: 在摆弄了代码和来自 mnies 的伟大提示之后,我发现了这个非常奇怪的 Bug:
如果我只是取消注释 AuthenticationException,我的代码突然按预期工作。可能是加载异常类调用 RedirectIfAuthenticated 中间件?! - 这绝对叫!
现在的简单解决方案是,为我的自定义中间件使用不同的异常,但问题是默认的“auth”-MW 也使用此异常,因此导致相同的错误。
记住:除了这个自己的中间件,我没有使用其他中间件,这个错误似乎真的在加载异常,比如 WTF?
所以我仍然需要帮助,为什么会发生这种情况!
错误:使用
throw new AuthenticationException('Unauthenticated.', []);
导致调用 'guest'-MW (RedirectIfAuthenticated) 而不是预期的 MW 堆栈! (无论顺序如何,都不会执行原始 MW 堆栈。
更新 2: 似乎抛出 RedirectIfAuthenticated 只是因为我之前被重定向到 /login 路由(并从那里通过它描述到 /home ),但这并没有改变发生这种随机重定向的问题。
[我正在尝试 atm 在全新安装中重现此错误]
更新 3:我无法在 Laravel 5.4.19 的全新安装中重现该错误......现在尝试比较两种安装。 D:
使用 Laravel 5.3.30。
我的一些上下文代码:
路线:
Route::get('/admin/user/get', ['middleware' => ['simpleauth', 'web'], 'uses' => 'UserEditAdmin\Controllers\Controller@get']);
自定义中间件:
class SimpleAuth
public function __construct()
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
* @throws AuthenticationException
*/
public function handle($request, Closure $next)
print "WTF";
throw new AuthenticationException('Unauthenticated.');
来自 Kernel.php 的“网络”:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
【问题讨论】:
如果你能在 Github 上放一个这个问题的最小例子,那就太好了。 【参考方案1】:看看你的\App\Http\Kernel.php
。看起来您总是在调用 \App\Http\Middleware\RedirectIfAuthenticated
中间件(别名为 guest)。如果你想调试,你可以在那个中间件中抛出一个异常来获取什么时候调用的堆栈跟踪。
【讨论】:
这似乎真的是问题,来自 RedirectIfAuthentificated 的异常被抛出 - 但我没有将它附加到路由......?我现在要搜索,但非常感谢:) - 我从上面的 Kernel.php 添加了我的“网络”,我从不调用 RedirectIfAuthentificated... 堆栈跟踪应该告诉你更多。我的猜测是你在某个地方定义了guest
,例如在你的控制器中。
遗憾的是没有堆栈跟踪。没有任何地方抛出错误。您可以自己尝试一下, AuthenticatedException 被 laravel 在内部捕获,并且重定向是结果(显然不是预期的结果)...如果我现在要在哪里写下来,我可能会在那里搜索-明天我猜...但我肯定知道:客人从来没有在任何地方定义过!我今天在这个问题上搜索了大约 5 个小时^^ [顺便说一句。你的想法]
@BenjaminMöckl 抱歉,我的原始答案错了。我写了“在路由中抛出异常”,但意思是说中间件。只需打开 RedirectIfAuthenticated 中间件,然后在重定向到 /home 之前,抛出您自己的异常。除非您的应用处于生产模式,否则您将看到整个堆栈跟踪。
不知何故我现在让它工作了,它是一堆小设置一起产生这种行为 - 现在工作正常:) 和你的帮助 ^^以上是关于使用自定义中间件会将我重定向到 /home,即使 Laravel 中的中间件是空的的主要内容,如果未能解决你的问题,请参考以下文章
我如何 CURL www.google.com - 它不断将我重定向到 .co.uk