Невозможно получить Политики, работающие в Laravel 5.3

Я следил за документами Laravel Authorization, пытаясь создать «разрешено ли пользователю делать это» с помощью политик, но я не могу заставить его работать. Я продолжаю получать This action is unauthorized и я пробовал с промежуточным программным обеспечением маршрута тоже.

PagePolicy.php:

namespace App\Policies;

use App\Models\User;
use App\Models\Page;

use Illuminate\Auth\Access\HandlesAuthorization;

class PagePolicy
{
use HandlesAuthorization;

/**
* Determine whether the user can view the page.
*
* @param  App\Models\User  $user
* @param  App\Models\Page  $page
* @return mixed
*/
public function view(User $user, Page $page)
{
return $user->id === $page->user_id;
}

/**
* Determine whether the user can create pages.
*
* @param  App\Models\User  $user
* @return mixed
*/
public function create(User $user)
{

}

/**
* Determine whether the user can update the page.
*
* @param  App\Models\User  $user
* @param  App\Models\Page  $page
* @return mixed
*/
public function update(User $user, Page $page)
{
//
}

/**
* Determine whether the user can delete the page.
*
* @param  App\Models\User  $user
* @param  App\Models\Page  $page
* @return mixed
*/
public function delete(User $user, Page $page)
{
//
}
}

PageController.php:

namespace App\Http\Controllers;

use Auth;
use Carbon\Carbon;

use App\Models\Page;

use App\Http\Requests\PageRequest;

class PageController extends ApiController
{
public function createNewPage(PageRequest $request)
{
$this->authorize('create', Page::class);

$request->merge([
'user_id' => Auth::id(),
'published_at' => Carbon::now(),
]);

if (Page::create($request->all())) {
return response()->json('success', 201);
}

return response()->json('error', 500);
}

}

AuthServiceProvidor.php:

namespace App\Providers;

use App\Models\Page;
use App\Policies\PagePolicy;

use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
Page::class => PagePolicy::class,
];

/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();

//
}
}

3

Решение

Мне удалось это выяснить. Я не использовал привязку модели маршрута. Итак, я добавил authorize() после вызова страницы и использовал $page переменная вместо Page::class,

public function update(PageUpdateRequest $request, $pageSlug)
{
$page = Page::where(['user_id' => Auth::id(), 'slug' => $pageSlug])->first();
$this->authorize('update', $page);
$page->update($request->all());
return fractal()->item($page, new PageTransformer())->toArray();
}
3

Другие решения

Мне не совсем ясно, какое действие вы пытаетесь авторизовать, так как вы предоставили вызов для создания в контроллере, но только предоставили проверку политики для просмотра страницы. Сказав это, я буду уверен, что var_dump / dd значения, которые вы пытаетесь сделать сравнение типов, чтобы убедиться, что они одного типа. Если что-либо было явно приведено, это может вызвать проблемы с определенными драйверами базы данных, которые возвращают целые числа в виде строк.

1

Я думаю, что проблема не в вашей политике, а в вашей PageRequest учебный класс. Убедитесь, что authorize() метод в вашем App\Http\Requests\PageRequest класс возвращается true ,

class PageRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true; // you can also check the authorization using PagePolicy here
}
}
0

Текущий код:

protected $policies = [
Task::class => TaskPolicy::class,
];

Код решения:

protected $policies = [
'App\Task' => 'App\Policies\TaskPolicy',
];

Я испытал ту же проблему, следуя Руководство по промежуточному списку задач на веб-сайте Laravel.

Решение на самом деле присутствует в Код Github для этого урока.

-1
По вопросам рекламы [email protected]