【问题标题】:Laravel Gates, how to use them in the API route?Laravel Gates,如何在 API 路由中使用它们?
【发布时间】:2020-07-20 06:57:53
【问题描述】:

我正在 AuthServiceProvider 中为我的 API 服务定义我的 Gates(遵循 Laravel 文档https://laravel.com/docs/7.x/authorization#gates):

Gate::define('view-users', function ($user) {
   return $user->hasAccess(['view-users'])
   or $user->inRole(['admin', 'operator']);
});

这是我的路线:

Route::group(['namespace' => 'Api', 'middleware' => ['auth:api']], function () {
        Route::get('/users', 'UserController@listing')->name('user.listing')->middleware(['can:view-users']);
});

如何从 Route API 文件中找到获取用户以在 Gate 中使用?

但我不完全明白这个$user 的来源。在我的请求中,我发送了一个授权承载令牌。我应该在我的门内使用它从数据库中获取正确的用户吗? Laravel 怎么知道$user 是谁?

【问题讨论】:

    标签: laravel jwt


    【解决方案1】:

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

    【讨论】:

    • 那么可以在路线中使用这些门吗?
    • 是的,有可能
    • 好的,但是在路线中,我如何将用户传递到大门?我在路由中看到门应该这样使用:Route::middleware('can:isAdmin'),没有任何参数。
    • 我通常这样使用:Gate::allows('example-action', Auth::user())
    • 我已经用我的路线示例更新了我的问题。
    【解决方案2】:

    $user 是当前登录的用户。不需要额外提供$user,或者把用户传进去。

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

    【讨论】:

    • 我正在使用 API,所以登录是通过 API 令牌完成的。我必须以某种方式将$user 传递到 Gate,最好是通过 Route 文件。
    • @f7n ,如果有登录用户,则不需要传递$user,laravel会为你解析,使用此代码auth()->user();来检查你是否有登录用户.
    【解决方案3】:

    你会从the documentation 注意到 Laravel 在 Gate 中为你提供了用户。

    它说(强调我的):

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

    正如 Andy Song 在 cmets 中指出的那样,Laravel 将通过 Auth 解析用户。如果没有没有用户(没有登录,或者没有认证),那么,根据the docs

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

    如果你想跟踪你的用户是如何被认证的,你的代码 sn-p 定义了这个中间件:

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

    这使用auth 中间件,以api 作为参数。您的中间件在 app/Http/Kernel.php 中定义,假设您使用的是普通 Laravel,它会在您进行门检查之前继续对您的用户进行身份验证。

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 2017-01-25
      • 1970-01-01
      • 2019-02-19
      • 2020-05-21
      • 1970-01-01
      • 2014-05-07
      • 2021-10-07
      • 1970-01-01
      相关资源
      最近更新 更多