Laravel 用户更新自己的权限 post

Laravel user permission to update own post

我正在学习有关 Laravel 门的教程,其中允许具有 'update-post' 权限的用户编辑数据库中的任何 post。此外,任何用户无论权限如何都可以编辑他们提交的 post。

app/Providers/AuthServiceProvider.php:

Gate::define('update-post', function ($user, \App\Post $post) {
     return $user->hasAccess(['update-post']) or $user->id == $post->user_id;
});

routes/web.php:

Route::get('/edit/{post}', 'PostController@edit')
    ->name('edit_post')
    ->middleware('can:update-post,post');

Route::post('/edit/{post}', 'PostController@update')
    ->name('update_post')
    ->middleware('can:update-post,post');  

我正在寻找一种添加新权限的方法,比如 'update-own-post',只有拥有该权限的用户才可以编辑他们自己的 post。

因此,例如,版主将拥有允许他们编辑所有 post 的权限 'update-post'。如果为普通用户分配了新权限 'update-own-post',普通用户将只能编辑他们自己的 post,但不是当前实施的每个用户。

在我的代码中实施此更改的最佳方法是什么?

您要在 Gate 中检查用户类型,因此如果满足以下任一条件,他们应该能够进行编辑:

  1. $user->hasAccess(['update-post'])
  2. $user->id == $post->user_id
  3. $user->isModerator()

我不知道您是如何设置用户类型的,但我建议您在用户模型中添加一个方法来检查用户类型,如果用户类型是 'moderator' 或无论您选择什么名称,它都应该 return 正确。

你会得到类似的东西:

Gate::define('update-post', function ($user, \App\Post $post) {
    return $user->hasAccess(['update-post']) || $user->id == $post->user_id || $user->isModerator();
});

编辑 -- 来自评论的回答

根据您的评论,您可以像这样完成它,这是清理后的代码:

Gate::define('update-post', function ($user, \App\Post $post) { 
    return ($user->id == $post->user_id && $user->hasAccess(['update-own-post'])) || $user->hasAccess(['update-post']); 
});

之所以可行,是因为您正在检查 {first condition} OR {second condition} 是否符合条件。如果第一个块为真,则第二个块甚至不会执行;但是,如果第一个块不正确,它将检查第二个块是否为真。