Laravel 5:在允许用户编辑之前检查用户是否属于版主列表

时间:2015-10-07 14:06:17

标签: php mysql laravel laravel-5 eloquent

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

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

我现在正在尝试添加其他权限来检查用户是否属于"主持人"表,如果是的话,他也可以看到"编辑" subreddit/show

上的链接

它适用于前两个检查,但在第三个和#34;编辑"链接始终可见,即使我无法访问不属于或属于我所拥有的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获取我的id为3,这是当前登录的用户ID。但是门检查仍然失败,无法编辑我作为主持人的subreddit中的帖子。

我的桌子

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;
});

这是show()

上的PostsController方法

请注意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);
}

这就是我检查用户是否有权查看"编辑"链接视图

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

$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 (in_array($user->id, $moderators_list)) { //will need to add ->toArray(); after the ->get() in the $moderators_list query.
            return true;
        }

        return false;
});

现在您需要添加 - &gt; toArray();在$ moderators_list查询中的&gt; get()之后:

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)->get()->toArray;

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