该策略具有以下代码:
public function view(User $user, User $model): bool
{
return ($user->id == $model->id || in_array('read_users', $user->access));
}
第一个模型是登录用户,第二个模型是查看用户。没有任何效果,因为第二种模式不会进入政治领域。
一切从路由开始:
Route::get('/{id}', [UserController::class, 'show'])->name('users.show')->middleware('can:view,' . User::class);
控制器中不使用模型绑定,因为使用数据库的逻辑放置在存储库中。
你有一个逻辑错误。您在中间件中传递类的名称,并在您检查对象的策略中。如果您查看文档,则 Model::class 在不需要对象验证的策略方法中传递。
那些。如果不取中间件,而是在控制器中检查,那么区别是这样的:
在您的逻辑中,您需要策略中的一个对象。也就是说,如果您将支票转移到控制器,它将是这样的:
你传递给中间件的是什么?不是对象,而是类名。
如何在那里转移必要的对象?以一种简单的方式,仅当您编写自己的 RBAC 或对默认的 RBAC 进行包装时。同样,您仍然不会将对象传递给中间件,但您可以从中间件中的请求中获取参数并创建一个模型以进行验证。
没有拐杖和花里胡哨的最简单的方法是在控制器中进行授权。