Laravel Gates,如何在API路线中使用它们?

Laravel Gates,如何在API路线中使用它们?,laravel,jwt,Laravel,Jwt,我正在AuthServiceProvider中为我的API服务定义我的大门(遵循Laravel文档): 这是我的路线: Route::group(['namespace' => 'Api', 'middleware' => ['auth:api']], function () { Route::get('/users', 'UserController@listing')->name('user.listing')->middleware(['can:vi

我正在AuthServiceProvider中为我的API服务定义我的大门(遵循Laravel文档):

这是我的路线:

Route::group(['namespace' => 'Api', 'middleware' => ['auth:api']], function () {
        Route::get('/users', 'UserController@listing')->name('user.listing')->middleware(['can:view-users']);
});
如何从路由API文件中找到要在Gate中使用的用户


但是我不太明白这个
$user
是从哪里来的。在我的请求中,我将发送授权持有人令牌。我应该在我的门内使用它从数据库中获取正确的用户吗?拉威尔如何知道谁是
$user

拉威尔不知道
$user
是谁。当您使用
门时,需要通过它。如果将
Auth::user()
作为正在使用的
门的第一个参数传递,则编写的代码将正常工作。在其他情况下,您需要使用任何给定的输入从数据库中获取
用户

$user
是当前登录的用户。您不需要提供额外的
$user
,也不需要将用户传入

因此,如果你的应用程序当前有一个登录用户,那将是一个。如果没有登录用户,gate将返回false,这将保护您的资源。

您会注意到,Laravel在gate中为您提供了用户

上面写着(我的):

Gates是确定用户是否有权执行给定操作的闭包,通常使用Gate facade在App\Providers\AuthServiceProvider类中定义闸门始终会收到一个用户实例作为其第一个参数。

正如Andy Song在评论中指出的,Laravel将通过Auth解析用户。如果没有用户(未登录或没有身份验证),则根据:

默认情况下,如果传入的HTTP请求不是由经过身份验证的用户发起的,则所有门和策略自动返回false

如果要跟踪用户如何获得身份验证,代码段将定义以下中间件:

'middleware'=>['auth:api']


这将使用
auth
中间件,并将
api
作为参数。您的中间件是在
app/Http/Kernel.php
中定义的,假设您使用的是stock Laravel,那么它将在进行闸门检查之前对您的用户进行身份验证。

那么在路由中是否可以使用这些闸门呢?是的,这是可能的,但是在路由中,我如何将用户传递到闸门?我看到在路由中,gate应该这样使用:
Route::middleware('can:isAdmin')
,没有任何参数。我通常这样使用:
gate::allows('example-action',Auth::user())
我已经用我的路由示例更新了我的问题。我使用的是API,所以登录是通过API令牌完成的。我必须以某种方式将
$user
传递到大门,最好是通过路由文件。@f7n,如果有登录的用户,您不需要传递
$user
,laravel将为您解析,使用此代码
auth()->user()
检查您是否有登录用户。
Route::group(['namespace' => 'Api', 'middleware' => ['auth:api']], function () {
        Route::get('/users', 'UserController@listing')->name('user.listing')->middleware(['can:view-users']);
});