要点很简单:我有一个 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,
];
我的 routes.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