我现在很有想法。
案例是:我有一个API端点的路由(工作正常,响应JSON等)。
如果我现在应用内置的' auth'中间件到路由,我被重定向到/ home路由。看起来我正在做某事。认证错了?我认为错了,因为:
如果我不使用' auth'这个好奇的重定向也会启动。但是一个自定义中间件,包含NOTHING但是
public function handle($request, Closure $next)
{
print "WTF";
throw new AuthenticationException('Unauthenticated.');
}
[打印和异常永远不会被抛出!我在/ home没有错误地再次登陆。]
并非所有中间件都会产生此错误:例如,' auth.basic'和'网络'这条路线正好运转。
我也申请了网络'根据我发现的一些结果,我自己的中间件都在路线上,说是使用' web'为他们解决了类似的问题,但猜测是什么,没有任何改变。
TL:DR:如果我使用自己的中间件或' auth'我被重定向,在中间件本身被执行之前。
更新: 在摆弄了代码和来自mnies的伟大的tipp之后,我发现了这个非常好奇的Bug:
如果我只是取消注释AuthenticationException ,我的代码突然按预期运行。可能是加载Exception-Class调用RedirectIfAuthenticated Middleware ?! - 这绝对叫做!
现在,对我的自定义中间件使用不同的Exception,简单的解决方案,但问题是默认的' auth' -MW也使用此异常,因此导致相同的Bug。
请记住:我没有使用其他中间件而不仅仅是这个中间件,这个bug似乎真的加载了Exception,就像WTF一样?
所以我仍然需要帮助,为什么会发生这种情况!
错误:使用
throw new AuthenticationException('Unauthenticated.', []);
导致' guest' -MW(RedirectIfAuthenticated)被调用而不是预期的MW堆栈! (无论顺序如何,原始MW堆栈都没有被执行。
更新2: 看起来RedirectIfAuthenticated只是因为我之前被重定向到/ login路由(并从那里通过它描述到/ home),但这并没有改变这种随机重定向发生的问题。
[我尝试在新安装中重现此Bug]
更新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',
],
];
答案 0 :(得分:1)
看看你的\App\Http\Kernel.php
。看起来您总是调用\App\Http\Middleware\RedirectIfAuthenticated
中间件(别名为 guest )。你要调试它,你可以在该中间件中抛出一个异常,以获得所谓的堆栈跟踪。