是否可以在Laravel的同一控制器上同时使用auth和auth:api中间件?

时间:2018-09-06 20:23:43

标签: php laravel laravel-passport

我得到了使用Laravel Passport(用于OAUTH2支持)为移动设备实现API的任务。我想重复使用网站上使用的相同Controller方法(其中一些方法)。我尝试这样做:

public function __construct()
{
    $this->middleware('auth');
    $this->middleware('auth:api');
}

但这不起作用(为什么?)。我是否只需要为api创建新的控制器?谢谢!

2 个答案:

答案 0 :(得分:0)

您可以在路由文件中指定多个中间件。

AND [column] BETWEEN v1 AND V2

但是您似乎可以在api路由文件中使用Route::middleware(['auth:api', 'auth'])->group(function() { //my routes }); ,在Web路由文件中使用auth:api

此外,如果您希望中间件整个控制器而不通过路由进行分组,则可以使用中间件组。

在您的Http auth中向数组Kernel.php添加新索引

$middlewareGroups

然后,您应该可以在控制器中执行以下操作:

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,
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],

    'both' => [
        'auth:api',
        'auth'
    ],
];

此外,您可以从中间件组中排除控制器中的方法。

public function __construct() {
    $this->middleware('both');
}

答案 1 :(得分:0)

如果您要让2个不同的Auth Guards检查用户,则可以使用auth中间件来进行。它使用未指定数量的参数:

auth:web,api

这将检查用户的每个保护措施,直到返回一个用户,然后将其用作请求的当前保护措施。

您所拥有的是栈中运行的2种不同的中间件。由于只有其中一个会通过,因此您的设置始终“未经身份验证”。 (除非您进行了会话并且出于某种奇怪的原因传递令牌)。

SO - Laravel two diffrent middleware authentication from auth middleware only

SO - Laravel multi auth protecting route multple middleware not working