Laravel 5 拉威尔的政策出奇地不起作用
要点很简单:我有一个UserPolicy方法来检查用户是否想要编辑他/她的个人资料。所以我喜欢这样:Laravel 5 拉威尔的政策出奇地不起作用,laravel-5,acl,policies,Laravel 5,Acl,Policies,要点很简单:我有一个UserPolicy方法来检查用户是否想要编辑他/她的个人资料。所以我喜欢这样: public function update(User $user, User $model) { return $user->id === $model->id; } protected $policies = [ // 'App\Model' => 'App\Policies\ModelPolicy', 'App\User' => 'App\
public function update(User $user, User $model)
{
return $user->id === $model->id;
}
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
'App\User' => 'App\Policies\UserPolicy',
'App\Post' => 'App\Policies\PostPolicy',
];
这在UserController中调用,如下所示:
public function edit(User $user)
{
$this->authorize('update', $user);
return view('users.edit')->with('user', $user);
}
PostController和PostPolicy中的一切都是一样的,这意味着检查用户是否可以编辑他/她自己的帖子,并且它可以工作。唯一的区别在于它们的签名,因为其中一个有两个用户(第一个是由Laravel注入的当前经过身份验证的用户,另一个是我要检查它的实例),另一个有上述自动注入的经过身份验证的用户和一个post实例。无论如何,它抛出:
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,
];
my 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
@if($user->id==Auth::id())
@恩迪夫
我自己给出了一个答案:我试图编写模型和策略的完整路径,而不是通过类的名称注册策略,它是有效的(当然,我不知道为什么)
我喜欢这样:
public function update(User $user, User $model)
{
return $user->id === $model->id;
}
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
'App\User' => 'App\Policies\UserPolicy',
'App\Post' => 'App\Policies\PostPolicy',
];
不管怎样,谢谢大家帮助我。希望有一天它能帮助别人 您是否将UserPolicy添加到身份验证服务提供商?是的,我添加了。我也跟着文档、互联网和一本书走了:(你能给我们看看你的
AuthServiceProvider
?如果你把它改成$user->id=$model->id
,这行得通吗?不……同样的问题……它帮助了我的唯一解决方案。如果有人能解释一下为什么它会这样工作,那会很有帮助吗?