【问题标题】:Laravel Authorization can always return false for APILaravel 授权总是可以为 API 返回 false
【发布时间】:2021-04-11 23:09:17
【问题描述】:

我正在尝试将 Laravel 授权策略与 API 和 Sanctum 一起使用。但是,我在路由上使用中间件如下。

Route::get('/user/orders/{order}', 
    [OrderController::class, 'get_user_order_detail'])
    ->middleware('can:view:order');

OrderPolicy.php

namespace App\Policies;

use App\Models\Order;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class OrderPolicy
{
    use HandlesAuthorization;

    /**
     * Create a new policy instance.
     *
     * @return void
     */
    public function __construct()
    {
        // dd(1);
    }

    public function view(User $user, Order $order): bool
    {
        return $user->id === $order->user_id;
    }
}

如您所见,当我在 OrderPolicy 的构造函数中添加 dd(1) 时,我得到了预期的 1,但是当我将它移到 view 函数的内部时,我得到了 unauthorized,这表明那可能是 view 函数本身没有被调用,但是 OrderPolicy 被调用了。

【问题讨论】:

  • 不是应该自动发现吗?根据文档,如果我将我的警察命名为 ModelPolicy 并且它处于或高于模型级别,那么它应该被自动发现,并且如您所见,正在调用该类的构造函数,但不是所需的函数
  • 正在工作。?不工作所以就用这个
  • 它不会自动注册。因为 laravel Auth Service Provider 不知道要添加什么规则。 @KamleshPaul 为您提供了正确答案。
  • 使用can:view,order 而不是第二个:

标签: laravel laravel-8 laravel-authorization


【解决方案1】:

你的中间件定义有误:

->middleware('can:view:order')

应该是:

->middleware('can:view,order')

来自docs

Laravel 包含一个中间件,它可以在传入请求到达您的路由或控制器之前授权操作。默认情况下,Illuminate\Auth\Middleware\Authorize 中间件在 App\Http\Kernel 类中分配有 can 键。让我们探索一个使用can 中间件授权用户可以更新帖子的示例:

use App\Models\Post;

Route::put('/post/{post}', function (Post $post) {
    // The current user may update the post...
})->middleware('can:update,post');

在本例中,我们向 can 中间件传递了两个参数。这 第一个是我们希望授权的动作的名称,第二个是 我们希望传递给策略方法的路由参数。在这个 案例,因为我们使用implicit model binding,所以App\Models\Post 模型将传递给策略方法。如果用户不是 授权执行给定的操作,一个带有 403 的 HTTP 响应 状态码将由中间件返回。

【讨论】:

    猜你喜欢
    • 2018-01-07
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 2021-04-05
    • 2019-06-28
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多