使用自定义中间件将我重定向到/ home,即使Laravel中的中间件为空

时间:2017-04-27 11:08:23

标签: php laravel laravel-5.3 laravel-routing laravel-middleware

我现在很有想法。

案例是:我有一个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',
    ],
];

1 个答案:

答案 0 :(得分:1)

看看你的\App\Http\Kernel.php。看起来您总是调用\App\Http\Middleware\RedirectIfAuthenticated中间件(别名为 guest )。你要调试它,你可以在该中间件中抛出一个异常,以获得所谓的堆栈跟踪。