Php 如果当前用户不是作者,则Laravel拒绝为用户编辑帖子

Php 如果当前用户不是作者,则Laravel拒绝为用户编辑帖子,php,laravel,Php,Laravel,我有型号Post。如果用户不是此帖子的作者,我如何拒绝编辑帖子 我知道我只能用以下内容向用户显示他的帖子: Auth::user()->posts 因为模型用户有: public function posts() { return $this->hasMany('App\Models\Post'); } 但每个用户都可以使用链接: 编辑陌生人的帖子。我怎样才能防止这种情况 编辑帖子的我的控制器: /** * Show the form for editing the s

我有型号
Post
。如果用户不是此帖子的作者,我如何拒绝编辑帖子

我知道我只能用以下内容向用户显示他的帖子:

Auth::user()->posts
因为模型用户有:

public function posts() {
    return $this->hasMany('App\Models\Post');
}
但每个用户都可以使用链接:

编辑陌生人的帖子。我怎样才能防止这种情况

编辑帖子的我的控制器:

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit(Post $post)
{
    $cats = Categories::all();
    return view('sites.edit', compact('cats'));
}
我创建了策略:

public function edit(User $user, Post $post) {
    return $user->id === $post->user_id;
}

我可以向其他用户显示编辑表单post。。为什么?

你需要的是授权

通过运行以下命令创建策略:
php artisan make:policy PostPolicy

然后在服务提供商中注册creted策略:

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        Post::class => PostPolicy::class,
    ];

    /**
     * Register any application authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        //
    }
注册策略后,可以为其授权的每个操作添加方法。例如,让我们在PostPolicy上定义一个update方法,该方法确定给定用户是否可以更新给定的Post实例

更新方法将接收一个
User
和一个
Post
实例作为其参数,并应返回
true或false
,指示用户是否有权更新给定的Post。因此,在本例中,让我们验证用户id是否与帖子上的
user\u id
匹配:

<?php

namespace App\Policies;

use App\User;
use App\Post;

class PostPolicy
{
    /**
     * Determine if the given post can be updated by the user.
     *
     * @param  \App\User  $user
     * @param  \App\Post  $post
     * @return bool
     */
    public function update(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}
控制器中的

public function edit(Post $post)
{
    if(Auth::user()->id==$post->user->id){
        $cats = Categories::all();
        return view('sites.edit', compact('cats'));
    }else{
        // redirect user to home page 
        return redirect('/home');
    }
}

您可以在“编辑方法”中手动检查帖子所有者,或使用“读取当前用户”检查帖子所有者,然后查看其是否与帖子作者相同。在edit()方法中执行此操作。我没有写一个详细的答案,因为我和拉威尔合作的时间太长了。看一看,没有。没有工作。我可以显示编辑表单不重要您仍然必须在控制器方法中调用
authorize
,它才能工作。@Dumitru您在实现它时必须非常小心,它才能工作。请在控制器中执行方法编辑的示例?我需要做什么?