Как я могу сделать Политики авторизации в Laravel 5.3?

Я читаю здесь: https://laravel.com/docs/5.3/authorization#writing-policies

И я пытался это любить

Моя любимая политика выглядит так:

<?php
namespace App\Policies;
use App\User;
use App\Models\Favorite;
use Illuminate\Auth\Access\HandlesAuthorization;
class FavoritePolicy
{
use HandlesAuthorization;
public function view(User $user, Favorite $favorite)
{
return $user->id === $favorite->user_id;
}
}

Мой FavoriteController выглядит так:

<?php
use App\Models\Favorite;
...
class FavoriteController extends ApiController
{
...
public function index(Favorite $favorite)
{
$this->authorize('view', $favorite);
return view('profile.favorite');
}
}

Мой AuthServiceProvider выглядит так:

<?php
namespace App\Providers;
use App\Models\Favorite;
use App\Policies\FavoritePolicy;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
Favorite::class => FavoritePolicy::class,
];
public function boot()
{
$this->registerPolicies();
}
}

Когда я запускаю свою систему для отображения списка избранных, возникает такая ошибка:

Упс, похоже, что-то пошло не так.

1/1 HttpException в строке Handler.php 115: это действие
несанкционированным.

Какая реализация Правил авторизации правильная?

я попробую dd($user) в методе представления (FavoritePolicy) в результате отображаются пользовательские данные, которые заносятся в журнал. Это так

Но я пытаюсь dd($favorite)результат не отображает избранные данные пользователя, который в данный момент зарегистрирован. В то время как я проверяю таблицу, любимые данные пользователя, который в данный момент зарегистрирован, существуют

Как я могу решить эту проблему?

Обновить

Там результат dd($favorite) :

Favorite {#498 ▼
#fillable: array:3 [▶]
#connection: null
#table: null
#primaryKey: "id"#keyType: "int"#perPage: 15
+incrementing: true
+timestamps: true
#attributes: []
#original: []
#relations: []
#hidden: []
#visible: []
#appends: []
#guarded: array:1 [▼
0 => "*"]
#dates: []
#dateFormat: null
#casts: []
#touches: []
#observables: []
#with: []
+exists: false
+wasRecentlyCreated: false
}

0

Решение

Спасибо за дополнительную информацию в вашем обновлении!

Итак, вы хотите показать подробную страницу одного конкретного Favorite сущность, но только если пользователь является владельцем этой сущности?

Во-первых, небольшая «проблема»: обычно в Laravel вызывается метод контроллера, который показывает детали конкретной сущности. showне index, index это имя для методов, которые показывают список сущностей (в вашем примере: список избранных).

По поводу вашей проблемы:
Ваша политика проверяет, может ли пользователь, вошедший в данный момент, просмотреть пустой $favorite (см. dd($favorite) выводим в ваш пост обновление). Который означает, что $favorite также не установлен в вашем index метод.

Я думаю, у вас есть маршрут, определенный следующим образом:

Route::get('favorite/{id}', 'FavoriteController@index');

Это означает, что значение id вводится в ваш index метод в качестве параметра, но не Favorite юридическое лицо. Для запроса Favorite сущность это то, что вам нужно сделать в методе.

Итак, ваш метод должен выглядеть так:

public function index($favoriteId)
{
$favorite = Favorite::findOrFail($favoriteId);
$this->authorize('view', $favorite);
return view('profile.favorite')->with('favorite', $favorite);
}

Надеюсь, это поможет! Если нет, пожалуйста, добавьте комментарий!

1

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

Других решений пока нет …

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