политика в laravel всегда не авторизована - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь сделать политику в Post Model, я следую документации, но все равно возвращаю всегда false в api. php

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);
}

in PostPolicy

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 Ответ

0 голосов
/ 14 марта 2020

Причина возникновения этой проблемы заключается в том, что метод обновления в политике ожидает загруженный экземпляр модели, однако при текущей настройке вы передаете незагруженный / пустой экземпляр модели.

Вы можете обойти это, используя Привязка модели маршрута . Измените {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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...