Политика Laravel странно не работает - PullRequest
0 голосов
/ 23 мая 2018

Суть проста: у меня есть метод UserPolicy, который проверяет, хочет ли пользователь редактировать свой собственный профиль.Итак, я сделал так:

public function update(User $user, User $model)
{
    return $user->id === $model->id;
}

И это вызывается в UserController следующим образом:

public function edit(User $user)
{
    $this->authorize('update', $user);
    return view('users.edit')->with('user', $user);
}

Все то же самое в PostController и PostPolicy, предназначено для проверки, еслипользователь может редактировать свой собственный пост, и это работает.Единственное различие заключается в их подписи, поскольку у одного есть два пользователя (первый - текущий аутентифицированный пользователь, введенный Laravel, а другой - экземпляр, с которым я хочу это проверить), а другой имеет вышеупомянутого автоматически введенного аутентифицированного пользователя ипочтовый экземпляр.Во всяком случае, выдает:

Symfony \ Component \ HttpKernel \ Exception \ AccessDeniedHttpException

This action is unauthorized.

Я пытался dd($model), но я получил то же исключение.Зачем?Заранее спасибо!

РЕДАКТИРОВАТЬ

В моем AuthServiceProvider тоже все настроено:

    protected $policies = [
    // 'App\Model' => 'App\Policies\ModelPolicy',
    Post::class => PostPolicy::class,
    User::class => UserPolicy::class,
];

И так же мой route.php:

// Authentication Routes...
$this->post('login', 'Auth\LoginController@login')->name('login');
$this->post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
$this->post('register', 'Auth\RegisterController@register')->name('register');

// Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');

Route::get('/', 'HomeController@index')->name('home');

Route::resource('posts', 'PostController');

Route::resource('users', 'UserController')->except('index', 'create', 'store');

Все вышеперечисленное называется именно здесь:

@if ($user->id == Auth::id())
    <a class="btn btn-link float-right p-0"
    href="{{ route('users.edit', Auth::id()) }}">

        <i class="fas fa-cog"></i>
        Edit profile
    </a>

    <br><br><br>
@endif

1 Ответ

0 голосов
/ 29 мая 2018

Я даю ответ сам: я пытался написать полные пути модели и политики вместо регистрации политик по именам классов, и это работает (конечно, я не знаю почему).

Мне понравилось:

protected $policies = [
    // 'App\Model' => 'App\Policies\ModelPolicy',
    'App\User' => 'App\Policies\UserPolicy',
    'App\Post' => 'App\Policies\PostPolicy',
];

В любом случае, спасибо всем за попытку помочь мне.Надеюсь, это поможет кому-то еще!

...