我正在使用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
答案 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);
}