php - 拉维尔 5 : check if user belongs to the moderators list before allowing him to edit

标签 php mysql laravel laravel-5 eloquent

我正在使用 Gate 授权来检查用户是否有权访问或查看某些内容。

例如,我有一个 update-post 门定义,用于检查用户是否拥有该帖子或拥有该子项,如果是,他将能够看到“编辑”链接并访问编辑路线。否则,他将看不到任何东西。

我现在正在尝试添加另一个权限来检查用户是否属于“版主”表,如果是,他也将能够在 subreddit/show 上看到“编辑”链接

前 2 次检查效果很好,但第三次检查失败,“编辑”链接现在始终可见,即使我无法访问不属于我或不属于我拥有的 subreddit 的帖子的编辑路径.

编辑:我编辑了$moderators_list,它现在检查登录用户是否是他正在查看的帖子的 subreddit 的版主。 dd($moderators_list 给我一个包含正确值的列表。但是我不能使用 $moderators_list->user_id 来给 Undefined property: Illuminate\Database\Eloquent\Collection::$user_id

编辑 2: 我已经修复了获取 subreddit 版主用户的 user_id 的查询。所以现在使用 $moderators_list->user-id 得到 3 的 id,这是当前登录的用户 id。但是门检查仍然失败,无法编辑 subreddit 中的帖子我是主持人在。

我的 table

users: id, name, email...
subreddits: id, user_id...
posts: id, user_id, subreddit_id...
moderators: id, user_id, subreddit_id...

这是$gate定义

$gate->define('update-post', function ($user, $post, $moderators_list) {
        // Check if user is subreddit owner
        if ($user->id === $post->subreddit->user->id) {
            return true;
        }

        // Check if user is the post author
        if ($user->id === $post->user_id) {
            return true;
        }

        // Check if user is a moderator of a subreddit
        if ($user->id === $moderators_list->user_id) {
            return true;
        }

        return false;
});

这是 PostsController 上的 show() 方法

请注意 dd($moderators_list) 将输出此帖子所在的 subreddit 的所有版主列表,因此我得到了正确的结果。

public function show(Post $post, Subreddit $subreddit, Moderator $moderator)
{
        $post = Post::with('user.votes')->findOrFail($post->id);
        $moderator = Moderator::where('user_id', '=', Auth::id())->first();
        $moderators_list = Moderator::where('subreddit_id', '=', $post->subreddit->id)->where('user_id', '=', Auth::id())->first();

        return view('post/show')->with('post', $post)
                                ->with('moderator', $moderator)
                                ->with('moderators_list', $moderators_list);
}

这就是我检查用户是否有权查看 View 上的“编辑”链接的方式

@can('update-post', [$post, $moderator, $moderators_list])
     <a href="{{ action('PostsController@edit', $post->id) }}">Edit</a>
@endcan

最佳答案

您可以直接在数据库中检查用户是否是版主:

$isModerator = $post->subreddit->moderators()->where('user_id', $user->id)->exists();

关于php - 拉维尔 5 : check if user belongs to the moderators list before allowing him to edit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32994444/

相关文章:

php - 为变量分配默认值的最短方法?

php - 批量导入自定义属性 Magento

葡萄牙语 (PT-Br) 的 PHP + MySQL 编码问题

php - 在 Laravel 中批量更新具有不同值的表 [设置]

php - 对于 Blade @sections 周围的每个循环是否有可能

php - MySQL INSERT 查询从另一个表中获取值,包括一个变量

php - 如何在 Codeigniter 中将相关子查询用于事件记录查询

mysql - 一个查询,告诉每个位置的提交数量以及位置的名称

mysql - 创建更新后触发器时出现空字符串的无法解释的 MySQL 错误 #1064?

php - Laravel 递归地在 "app/database/migrations"文件夹上运行迁移