Laravel用户更新自己帖子的权限

时间:2017-09-25 21:08:26

标签: php laravel permissions roles

我正在关注Laravel大门的教程,其中允许具有“update-post”权限的用户编辑数据库中的任何帖子。此外,任何用户都可以编辑他们提交的帖子。

应用程序/提供者/ AuthServiceProvider.php:

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

路由/ 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',只允许拥有该权限的用户编辑自己的帖子。

因此,例如,主持人将拥有允许他们编辑所有帖子的权限'update-post'。如果普通用户被分配了新的权限“update-own-post”,而不是当前实施的每个用户,则他们只能编辑自己的帖子。

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

1 个答案:

答案 0 :(得分:0)

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

  1. button.heightAnchor.constraint(equalTo: (button.imageView?.heightAnchor)!, multiplier: 1, constant: 5).isActive = true button.widthAnchor.constraint(equalTo: (button.imageView?.widthAnchor)!, multiplier: 1, constant: 70).isActive = true
  2. $user->hasAccess(['update-post'])
  3. $user->id == $post->user_id
  4. 我不知道您的用户类型是如何设置的,但我建议您在用户模型中添加一种检查用户类型的方法,以及用户类型是否为'主持人&# 39;或者你选择的任何名字,它应该返回true。

    你会留下类似的东西:

    $user->isModerator()

    编辑 - 从评论中回答

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

    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']); }); 是否符合条件。如果第一个块为真,则第二个块甚至不会被执行;但是,如果第一个块不是真的,那么它将检查第二个块是否为真。