laravel 中的策略总是未经授权的

我正在尝试在 Post Model 中制定政策,我遵循文档但仍然在 api.php 中始终返回 false


Route::put('post/{id}','PostController@update')->middleware('auth:api');

在后控制器


public function update(Request $request, Post $post,$id){

        $this->authorize('update',$post);


        $request->validate(['content'=>'required']);

        $post = $post->find($id);

        $post->content = $request->content;

        $post->save();


return response()->json($post, 200);

}

在后政策


public function update(User $user, Post $post)

  {

        return $user->id === $post->user_id;

  }

在 AuthServiceProvider 中


protected $policies = [

        'App\Post' => 'App\Policies\PostPolicy',

];

请忽略模型,因为模型工作正常,如果我在控制器中评论 $this->authorize 工作正常,但没有身份验证,用户可以更新模型中的任何内容


我使用 api 使用邮递员进行测试


authorization = Bearer 'api_token'


catspeake
浏览 82回答 1
1回答

明月笑刀无情

您遇到此问题的原因是因为策略中的更新方法需要模型的已加载实例,但是,在您当前的设置中,您将传递模型的未加载/空实例。您可以通过使用Route Model Binding来解决这个问题。将您的路线更改{id}为{post}:Route::put('post/{post}','PostController@update')->middleware('auth:api');然后从您的方法中删除$id参数:update()public function update(Request $request, Post $post){    $this->authorize('update', $post);    $request->validate(['content' => 'required']);    $post->content = $request->content;    $post->save();    return response()->json($post, 200);}另外,请注意现在您不必使用find来加载模型,这是因为 Laravel 正在为您加载模型。路由模型绑定通过查找与 uri 段同名的参数名称来工作,即{post}在路由和$post方法参数上,并且由于$post类型提示是模型,Laravel 知道使用 的值{post}来加载(查找)Post模型。
打开App,查看更多内容
随时随地看视频慕课网APP