Laravel (7) Политики ресурсов не работают с camelCase, получите 403 для политики просмотра (показать в контроллере)

#laravel #authorization #policies

#laravel #авторизация #Политики

Вопрос:

Вот два примера, первый для ResourceController (возвращает 200 — ok), второй для ResourceLogsController (возвращает 403 — не авторизован)

api.php

 // RESOURCES
Route::apiResource('resources','ApiResourceController');

// RESOURCELOGS
Route::apiResource('resourcelogs','ApiResourceLogController');
  

AuthServiceProvider:

 use AppPoliciesResourcePolicy;
use AppPoliciesResourceLogPolicy;

// ...

    protected $policies = [
        Resource::class => ResourcePolicy::class,
        ResourceLog::class => ResourceLogPolicy::class
    ];
  

ResourceController:

     public function __construct()
    {
      $this->middleware('auth:api');
      $this->authorizeResource(Resource::class, 'resource');
    }

    public function index(Resource $resource)
    {
      dd('authorization ok');
    }

    public function show(Resource $resource)
    {
      dd('authorization ok');
    }
  

ResourceLogController:

     public function __construct()
    {
      $this->middleware('auth:api');
      $this->authorizeResource(ResourceLog::class, 'resourcelog');
    }

    public function index(ResourceLog $resourceLog)
    {
      dd('authorization ok');
    }

    public function show(ResourceLog $resourceLog)
    {
      dd('no authorization here');
    }
  

Политика ресурсов: просто возвращает простое значение true в качестве теста

 class ResourcePolicy
{
    use HandlesAuthorization;

    public function viewAny(User $user)
    {
        return true;
    }

    public function view(User $user, Resource $resource)
    {
        return true;
    }
  

ResourceLogPolicies: просто возвращает простое значение true в качестве теста

 
class ResourceLogPolicy
{
    use HandlesAuthorization;

    public function viewAny(User $user)
    {
        return true;
    }

    public function view(User $user, ResourceLog $resourceLog)
    {
        return true;
    }
  

Я попытался изменить второй параметр в $this->authorizeLogResource для нижнего регистра, chamelcase и т. Д..

$this->authorizeResource(журнал ресурсов::class, ‘resourcelog’); $this->authorizeResource(журнал ресурсов::class, ‘AppResourceLog’); // = Слишком мало аргументов для функции App Policies ResourceLogPolicy::view(), передано 1

Я вижу ресурс, а не журнал ресурсов в промежуточном программном обеспечении…

введите описание изображения здесь

Комментарии:

1. Я предполагаю, что это ошибка, я изменил существующий рабочий контроллер ресурсов с RuleController на AccessRightController, включая зависимости, и появился тот же 403

Ответ №1:

Ответ с помощью самого тейлоротуэлла:

В маршрутизаторе:

 Route::apiResource('resourceLogs','ApiResourceLogController');
  

Контроллер:

 public function __construct()
{
  $this->middleware('auth:api');
  $this->authorizeResource(ResourceLog::class, 'resourceLog'); 
}
  

Метод:

 public function show(ResourceLog $resourceLog)
{
return new ResourceLogResource($resourceLog);
}
  

resourceLogs‘ в Route и authorizeResource $resourceLog (!) должны иметь один и тот же корпус.