Laravel 5:如果用户是帖子的所有者或论坛类别的所有者,则允许用户编辑帖子

哈尔内克斯

到目前为止,我已经允许用户编辑自己的帖子,但是只要我通过该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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Laravel帖子所有者关系

如何在 Laravel 管理员列表显示中显示帖子的所有者?

Laravel 获取所有通过帖子评论帖子的用户

Laravel:返回多态关系的命名空间所有者

Laravel在所有者编辑员工时不带参数的路线

将干预图像保存在Laravel 5的所有者文件夹中

Laravel 5中间件“所有者”?

Django-如何只允许新帖子的所有者编辑或删除帖子?

Laravel获得用户评论的所有帖子

获取 Laravel 中未被屏蔽的用户的所有帖子?

在laravel中删除与用户相关的所有帖子

在Eloquent / Laravel中选择所有所有者不是软删除者的软删除项目

提交回复时通知评论所有者[LARAVEL]

Laravel所有者中间件不起作用

Laravel使用错误的所有者制作日志文件

获取cronjob的所有者/用户

获取在laravel中至少有一个帖子的所有用户

Laravel 7.x只有配置文件的所有者和某些角色可以输入或执行操作

如果用户不是参与者或所有者,Azure用户如何创建资源组?

Laravel Eloquent使所有类别的子级都拥有用户,并且哪些用户属于角色

用户==所有者中的“用户”是什么?

Laravel获得所有类别的父母

获取所有在Laravel中的帖子

如何根据帖子所有者在Django主页中显示帖子

WordPress MultiSite中博客所有者的用户ID

禁止用户的所有者对该表进行 GRANTing

所有者和用户的 Postgres 关系

该用户帐户所有者的权限

谁是共享文件所有者的最佳用户?