Общедоступный доступ с политикой Laravel

Я хочу сделать несколько записей 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);
}

0

Решение

Итак, получается, что вы всегда должны читать примечания к выпуску последней версии 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 необязательным, он становится пустым для гостевых пользователей и может быть обработан в политике.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]