所以我制定了一个策略,无论我做什么,网页都返回 403。 我对拉拉维尔很陌生,所以很可能我错过了一些:)
我做了一个模型php artisan make:model exercise
|(我知道我应该大写模型,但这是一个错字)
控制器:
php artisan make:controller ExercisesController
政策:
php artisan make:policy ExercisePolicy -m exercise
我在AuthServiceProvider中注册了策略.php(也尝试为"App\Models\exercise"=>'App\Policies\ExercisePolicy'):
protected $policies = [
// 'AppModelsModel' => 'AppPoliciesModelPolicy',
exercise::class => ExercisePolicy::class,
];
在练习控制器中.php这是我使用身份验证的函数:
public function create(AppModelsUser $user)
{
$this->authorize('create', $user);
return view('exercises/create');
}
在策略中,这就是我的创建函数的样子
public function create(User $user)
{
return $user->admin == true;
}
路线:
Route::get('/exercises/create', [AppHttpControllersExercisesController::class, 'create']);
我尝试放置die("策略被调用);并尝试从策略创建函数返回true以检查它是否到达该值,但它仍然返回403,在这一点上,我很确定策略本身没有被调用,因为它默认也返回403
如果有人能提前帮忙,谢谢!
对authorize
的调用是使用第二个参数来确定要使用的策略。由于第二个参数是$user
因此它将为您尚未定义的用户模型查找策略。要将策略用于exercise
模型,您必须传递类名,以便它知道要使用什么策略:
$this->authorize('create', exercise::class);
虽然你应该纠正你的拼写错误并将exercise.php
文件重命名为Exercise.php
,将类名重命名为Exercise
。
Laravel 8.x 文档 - 授权 - 编写策略 - 没有模型的方法
Laravel 8.x 文档 - 授权 - 使用策略的授权操作 - 通过控制器帮助程序 - 不需要模型的操作
我遇到了同样的问题,我了解到策略仅适用于经过身份验证的路由。
确保您的请求在实施策略时已经过身份验证。