Kentavr16
@Kentavr16
long cold winter

Почему проверка Police в мидлвер не работает?

продолжаю копание в ларавел. Зашел в очередной тупик. есть роуты
Route::prefix("products")->group(function (){
        Route::get("{product}/{cookProcess}",[CookProcessController::class,"show"]);
        Route::post("/{product}/cookProcessCreate",[CookProcessController::class,"store"]);//->middleware('can:create,cookProcess'); !!!это проблемный роут
        Route::delete("{product}/{cookProcess}",[CookProcessController::class,"destroy"])->middleware('can:delete,cookProcess');
        Route::patch("{product}/{cookProcess}",[CookProcessController::class,"update"])->middleware('can:update,cookProcess');
    });


Проблема с Route::post("/{product}/cookProcessCreate"). Если я устанавливаю на него мидлвер, то сервер при попытке взаимодействия возвращает 403 статус. Логировал соответствующую политику - метод create не отрабатывает совсем. При этом если использовать авторизацию не через мидлвер ($this->authorize('create',CookProcess::class)), все отрабатывает нормально. остальные роуты работают и логируются.
Я вообще уже не имею понятия в чем может быть дело.

Политика на всякий случай
<?php

namespace App\Policies;

use App\Models\Product;
use Illuminate\Auth\Access\Response;
use App\Models\CookProcess;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;

class CookProcessPolicy
{
    public function viewAny(User $user): bool
    {
        //
    }

    public function view(User $user, CookProcess $cookProcess): bool
    {
        Log::debug("process policyview launched");
        return Auth::check();
    }

    public function create(User $user): bool
    {
        Log::debug("process policy create launched");
        return Auth::check();
    }

    public function update(User $user, CookProcess $cookProcess): bool
    {
        Log::debug("process policyupdate launched");
        return $user->hasPermissionTo('edit notes');
    }

    public function delete(User $user, CookProcess $cookProcess): bool
    {
        Log::debug("process policydelete launched");
        return $user->hasPermissionTo('delete notes');
    }

    public function restore(User $user, CookProcess $cookProcess): bool
    {
        //
    }

    public function forceDelete(User $user, CookProcess $cookProcess): bool
    {
        //
    }
}

и тест которым проверяю
public function test_cook_process_can_be_created(): void
    {
        $this->seed(PermissionsTableSeeder::class);
        $this->seed(RolesTableSeeder::class);
        $user=User::factory()->create();
        $user->assignRole('site_user');
        $this->actingAs($user);
        $product=Product::factory()->create();
        $processData = [
            "name"=>'testname',
            "duration"=>fake()->numberBetween(1,10),
            "cookPresenceInterval"=>fake()->numberBetween(0,5),
            "description"=>fake()->text(50),
            "product_id"=>$product->id
        ];
        $response=$this->post("/api/products/".$product->id . '/cookProcessCreate',$processData);
        $response->assertStatus(200);
        $createdProcess = CookProcess::where('name','testname')->first();
        $this->assertNotNull($createdProcess);
    }

буду благодарен за любую подсказку куда копать.
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
Kentavr16
@Kentavr16 Автор вопроса
long cold winter
Мне ответили на стаковерфлоу. Пропустил момент - в урле роута нужная модель не используется, поэтому в мидлвере нужно явно ее прописать
Route::post("/{product}/cookProcessCreate",[CookProcessController::class,"store"])->middleware('can:create,App\Models\CookProcess');
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы