到目前为止,我已经允许用户编辑自己的帖子,但是只要我通过该if he's owner of the subreddit/category
条件,它就会完全停止工作。
我有这3张桌子
Users: id, name, email...
Subreddits: id, name, user_id...
Posts: id, link, title, user_id, subreddit_id...
这是edit()
方法PostsController.php
public function edit(Post $post, Subreddit $subreddit)
{
if(Auth::id() !== $post->user_id) {
return view('home')->withErrors('You cannot do that');
} else {
return view('post/edit')->with('post', $post)->with('subreddit', $subreddit);
}
}
这是观点
@if(Auth::id() == $post->user_id)
<a href="{{ action('PostsController@edit', [$post->id]) }}">Edit</a>
@endif
这可以正常工作,它仅检查登录的user_id是否与帖子的user_id相同,并且更新将通过。
但是,如果我添加,if(Auth::id() == $subreddit->user_id)
它将停止工作。它在所有帖子的视图上显示“编辑”链接,但是单击其中的任何一个,You cannot do that
即使是我拥有的帖子也给我验证错误。
因此,如何检查用户是文章的所有者还是类别的所有者以显示并允许EDIT?
更新方法 $subreddit->user_id
public function edit(Post $post, Subreddit $subreddit)
{
if(Auth::id() == $post->user_id || Auth::id() == $subreddit->user_id) {
return view('post/edit')->with('post', $post)->with('subreddit', $subreddit);
} else {
return view('home')->withErrors('You cannot do that');
}
}
视图
@if(Auth::id() == $post->user_id || Auth::id() == $subreddit->user_id)
<a href="{{ action('PostsController@edit', [$post->id]) }}">Edit</a>
@endif
这将允许我编辑自己的帖子,但仍会给You cannot do that
我自己论坛类别/ subreddit中帖子的验证错误。
这是Gate
我尝试过的政策,但也没有奏效
class AuthServiceProvider extends ServiceProvider
{
// Authorizations and Permissions
public function boot(GateContract $gate)
{
parent::registerPolicies($gate);
$gate->define('update-post', function ($user, $post) {
return $user->id === $post->user_id;
});
$gate->define('mod-update-post', function ($user, $subreddit) {
return $user->id === $subreddit->user_id;
});
}
PostsController.php
public function edit(Post $post, Subreddit $subreddit, User $user)
{
if(Gate::denies('update-post', $post) && Gate::denies('mod-update-post', $subreddit)) {
return view('home')->withErrors('You cannot do that');
} else {
return view('post/edit')->with('post', $post)->with('subreddit', $subreddit);
}
}
视图
@can('update-post', $post)
<a href="{{ action('PostsController@edit', [$post->id]) }}">Edit</a>
@endcan
使用上面的代码,如果'update-post'为true,我终于可以编辑帖子,但是我不能检查是否mod-update-post
也为true,我一直收到验证错误You cannot do this
dd($subreddit)
内部的edit()方法显示一个空数组。https://cryptbin.com/x6V6wX#26810f755a62f6c8837c0c0fe0371dcf
编辑:我想我已经解决了。我使用$post->subreddit->user->id
而不是$subreddit->user_id
因为它返回null。现在,所有这些似乎都基于帖子属于用户还是用户是论坛所有者而起作用。
但是视图上的编辑链接仍然显示我是否有权访问。我无法为仔细检查update-post
,并mod-update-post
同时进行。而且@can('update-post', $post)
只能使用一次,因此无法再次确认。
因此,如何检查用户是文章的所有者还是类别的所有者以显示并允许EDIT?
使用Laravel的新授权组件。
编辑:我认为您误解了应如何使用授权。它应用于检查当前用户是否可以执行某项操作。因此,您不想为不同的用户类型定义多种方法。
以编辑帖子为例。授权检查的名称为:@can('edit', $post)
。您无需为普通用户定义另一个,而为主持人定义另一个。只需将逻辑添加到您的edit post方法:
class PostPolicy
{
public function edit(User $user, Post $post)
{
// If user is administrator, then can edit any post
if ($user->isModerator()) {
return true;
}
// Check if user is the post author
if ($user->id === $post->author_id) {
return true;
}
return false;
}
}
如您所见,我在同一方法中执行不同的检查,因此在Blade模板中,您可以执行以下操作:
@can('edit', $post)
<a href="{{ route('post.edit', $post->getRouteKey()) }}">Edit post</a>
@endcan
希望这可以清除一切。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句