Я хочу сделать несколько записей Analysis
общедоступный. Я пытался реализовать его с помощью политик, но не смог. Я думаю, это потому, что AuthServiceProvider
не удается с AccessDeniedHttpException
каждый раз, когда я пытаюсь получить доступ без авторизованного пользователя.
AuthServiceProvider
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Analysis::class => AnalysisPolicy::class
];
public function boot()
{
$this->registerPolicies();
}
}
AnalysisPolicy
public function view(User $user, Analysis $analysis)
{
if($analysis->demo === true){
return true;
}
return $user->id === $analysis->user_id;
}
AnalysisController
public function show(int $analysis)
{
$ana = Analysis::find($analysis);
$this->authorize('view', $ana);
...
}
Я пытался просто создать нового поставщика услуг, но это тоже не сработало, так как я не могу вызвать функцию registerPolicies без выхода из AuthServiceProvider.
В общем, все, что я хочу, это теперь проверить что-нибудь, если demo
Атрибут верный.
Редактировать:
Моя форма Quick-Fix теперь просто проверяет контроллер, является ли это демо. Но, на мой взгляд, это не очень хорошее решение, так как я считаю, что цель политик должна заключаться в том, чтобы у меня не было управления доступом в контроллере. Поэтому я бы хотел найти лучшее решение.
if(!$ana->demo){
$this->authorize('view', $ana);
}
Итак, получается, что вы всегда должны читать примечания к выпуску последней версии Laravel, прежде чем задавать вопрос.
Начиная с Laravel 5.7 для этого есть правильное решение:
public function update(?User $user, Post $post)
{
return $user->id === $post->user_id;
}
(https://laravel.com/docs/5.7/authorization#writing-policies)
Объявляя $ user необязательным, он становится пустым для гостевых пользователей и может быть обработан в политике.
Других решений пока нет …