【问题标题】:Specify custom middleware execution order in Laravel 5.8在 Laravel 5.8 中指定自定义中间件执行顺序
【发布时间】:2019-04-23 20:55:31
【问题描述】:

我有一个自定义中间件,用于识别应用程序中的租户。当我在没有“auth”中间件的情况下调用端点时,它会正确识别租户并可以根据需要读取表。但是,我需要在确定租户后执行身份验证(即为身份验证用户查询正确的数据库)我似乎看不到我的配置哪里出错了。我收到一条错误消息:

未定义索引:数据库

但这是因为我的 identifyTenant 中间件尚未运行以在 auth 中间件尝试进行身份验证时设置数据库。

路由组

Route::group(['middleware' => ['tenant', 'auth', 'manager_admin']], function () {

Route::resource('invoice',  'InvoiceController');});

docs 中建议的 kernel.php 的优先中间件部分

 protected $middlewarePriority = [
    // --- Added identify m.ware at the top to run first.
    \App\Http\Middleware\IdentifyTenant::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\Authenticate::class,
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    \Illuminate\Auth\Middleware\Authorize::class,
];

kernel.php 的路由中间件部分

protected $routeMiddleware = [
    'tenant'         => \App\Http\Middleware\IdentifyTenant::class,
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];

我正在使用 laravel 5.8。

【问题讨论】:

    标签: php laravel-5


    【解决方案1】:

    你可以试试这个

    Route::group(['middleware' => ['tenant']], function () {
        Route::group(['middleware' => ['auth']], function () {
            Route::group(['middleware' => ['manager_admin']], function () {
                Route::resource('invoice',  'InvoiceController');
            });
        });
    });
    

    Route::resource('invoice',  'InvoiceController')->middleware('tenant')->middleware('auth')->middleware('manager_admin');
    

    【讨论】:

    • 这似乎也不起作用。 Auth 仍然在租户之前触发。文档是错的还是我错过了 $middlewarePriority 的要点?
    • 这里有同样的问题。尝试了很多事情都没有成功。你找到解决办法了吗?
    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    相关资源
    最近更新 更多