#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 (!) должны иметь один и тот же корпус.