Laravel 策略 - 从控制器传输错误的用户
Laravel Policy - Wrong User transmitted from Controller
我注册了访问用户个人资料(查看、编辑)的政策。
我要么允许它,如果:
- 您要查看的个人资料属于您
- 您有权限 "edit any profile"。
所以这是我的 view()
- 政策中的功能:
public function view(User $user)
{
debug('User in Controller: '.$user->id);
return (Auth::user()->id === $user->id) || Auth::user()->can('edit any profile');
}
这是显示从 ProfileController 获取的配置文件视图的方法:
public function show(User $user) {
debug('User in Controller: '.$user->id);
$this->authorize('view', $user);
return view('profile.index')->with([
"user" => $user,
]);
}
最后是路线:
Route::get('/profile/{user}', 'ProfileController@show')->name('profile');
当然在AuthServiceProvider中已经注册了Policy:
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
User::class => ProfilePolicy::class,
];
基本上控制器将错误的用户传输到策略。以下是来自各自 debug()
的消息:
所以我不想回答我自己的问题,但我发现了问题所在。策略函数中的第一个参数始终是当前用户的实例。
所以您可以在您的保单中加入:
public function view(User $currentUser, User $user)
{
return $currentUser->is($user) || $currentUser->can('edit any profile');
}
Laravel 自动将 $currentUser
设置为 Auth::user()
。
我注册了访问用户个人资料(查看、编辑)的政策。 我要么允许它,如果:
- 您要查看的个人资料属于您
- 您有权限 "edit any profile"。
所以这是我的 view()
- 政策中的功能:
public function view(User $user)
{
debug('User in Controller: '.$user->id);
return (Auth::user()->id === $user->id) || Auth::user()->can('edit any profile');
}
这是显示从 ProfileController 获取的配置文件视图的方法:
public function show(User $user) {
debug('User in Controller: '.$user->id);
$this->authorize('view', $user);
return view('profile.index')->with([
"user" => $user,
]);
}
最后是路线:
Route::get('/profile/{user}', 'ProfileController@show')->name('profile');
当然在AuthServiceProvider中已经注册了Policy:
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
User::class => ProfilePolicy::class,
];
基本上控制器将错误的用户传输到策略。以下是来自各自 debug()
的消息:
所以我不想回答我自己的问题,但我发现了问题所在。策略函数中的第一个参数始终是当前用户的实例。
所以您可以在您的保单中加入:
public function view(User $currentUser, User $user)
{
return $currentUser->is($user) || $currentUser->can('edit any profile');
}
Laravel 自动将 $currentUser
设置为 Auth::user()
。