Laravel - политика авторизации для пользователя и объекта, которые оба относятся к чему-либо - PullRequest
0 голосов
/ 26 октября 2018

Я хочу авторизовать мой API моего приложения Laravel. Моя структура сейчас такая:

Пользователи принадлежат организации, и у организации есть много (скажем, объектов). Теперь я хочу, чтобы только пользователи могли просматривать / редактировать / создавать / удалять объекты, принадлежащие организации, частью которой они являются.

Мой маршрут API для просмотра объектов:

Route::get('organizations/{id}/objects','ObjectController@indexOrganization')->middleware('auth:api');

Я создал пользователя моделей, организацию и объект. Все они имеют свой собственный контроллер.

Я создал ObjectPolicy и попробовал это:

public function view(User $user, Object $object)
    {
      return $user->organization_id === $object->organization_id;
    }

А потом я добавил ->middleware('can:view,object'); к маршруту. К сожалению, это не работает, и документация Laravel не предоставляет необходимую мне информацию.

Может кто-нибудь помочь? Спасибо!

EDIT

Понятия не имею, что я делаю не так !! Я изменил все, но я все еще получаю ответ 403.

Вот мой код:

Маршрут:

Route::get('organizations/{organization}/objects','ObjectController@index Organization')->middleware('auth:api', 'can:view, organization');

OrganizationPolicy:

public function view(User $user, Organization $organization)
{
    return $user->organization_id === $organization->id;
}

ObjectController:

public function indexOrganization(Organization $organization)
{
  $objects = $organization->objects;
  return ObjectResource::collection($objects);
}

Я также добавил это к своему AuthServiceProvider:

protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    App\Organization::class => App\Policies\OrganizationPolicy::class,
];

РЕДАКТИРОВАТЬ 2 / РЕШЕНИЕ

Ответ от newUserName02 работает! Проблема была внутри AuthServiceProvider. После того, как я изменил код (см. Выше в Edit) там:

protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    'App\Organization' => 'App\Policies\OrganizationPolicy',
];

это сработало!

1 Ответ

0 голосов
/ 26 октября 2018

Метод политики должен соответствовать аргументам, которые вы передаете контроллеру. Похоже, вы передаете идентификатор Organization в маршруте, но вы пытаетесь проверить Object в политике.

https://laravel.com/docs/5.7/authorization#via-middleware

Вы можете воспользоваться неявной привязкой модели Laravel для внедрения Организации в контроллер следующим образом:

Маршрут:

Route::get('organizations/{organization}/objects','ObjectController@indexOrganization')->middleware('auth:api', 'can:view,organization');

политика:

public function view(User $user, Organization $organization)
{
  return $user->organization_id === $organization->id;
}

Контроллер:

public function indexOrganization(Organization $organization)
{
    ...
}

Обратите внимание, что {organization} в маршруте соответствует organization в вызове ->middleware(), что соответствует $organization в политике и контроллере.

...