为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
catspeake 2022-10-28 16:14:01
我正在尝试在 Post Model 中制定政策,我遵循文档但仍然在 api.php 中始终返回 falseRoute::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'
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

您遇到此问题的原因是因为策略中的更新方法需要模型的已加载实例,但是,在您当前的设置中,您将传递模型的未加载/空实例。


您可以通过使用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模型。


查看完整回答
反对 回复 2022-10-28
  • 1 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信