【问题标题】:Laravel user permission to update own postLaravel 用户更新自己帖子的权限
【发布时间】:2018-03-06 22:55:40
【问题描述】:

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

app/Providers/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-own-post”时才能编辑自己的帖子,但不是当前实施的每个用户。

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

【问题讨论】:

    标签: php laravel permissions roles


    【解决方案1】:

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

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

    我不知道您是如何设置用户类型的,但我建议您在用户模型中添加一个方法来检查用户类型,以及用户类型是“版主”还是您选择的任何名称,它应该返回 true。

    你会得到类似的东西:

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

    编辑——来自 cmets 的回答

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

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

    【讨论】:

    • 感谢您为我指明了正确的方向。通过将门更改为以下内容,我能够完成我需要的工作:Gate::define('update-post', function ($user, \App\Post $post) { if(($user->id == $post->user_id) && ($user->hasAccess(['update-own-post']))) return true; else if ($user->hasAccess(['update-post'])) return true; }); 不过希望代码更简洁。
    • 我很高兴你解决了它,检查我的代码以获得你所拥有的更清晰的版本。我还建议在 PHP 中查看 OR ('||'),它将帮助您摆脱一些额外的条件检查。 php.net/manual/en/language.operators.logical.php
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 2016-06-26
    相关资源
    最近更新 更多