Junior: питання на співбесіді з теми «Авторизація»
Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.
2 питання
Права описують у Gate або Policy, а перевіряють у трьох місцях: контролері, шаблоні й формі запиту.
У контролері - authorize(), який кидає 403 сам:
public function update(Request $request, Post $post)
{
$this->authorize('update', $post);
// сюди дійде лише той, кому можна
}
Або через фасад, коли потрібна саме перевірка, а не зупинка:
if (Gate::allows('update', $post)) {
// ...
}
if ($request->user()->cannot('update', $post)) {
abort(403);
}
У Blade - директиви, які ховають те, чого не можна:
@can('update', $post)
<a href="{{ route('posts.edit', $post) }}">Редагувати</a>
@endcan
@cannot('update', $post)
<span>Тільки перегляд</span>
@endcannot
У маршруті - middleware can:
Route::put('/posts/{post}', [PostController::class, 'update'])
->middleware('can:update,post');
Важливо: @can у шаблоні лише ховає кнопку. Це зручність для користувача, а не захист - без перевірки в контролері запит усе одно можна надіслати вручну. Перевірка на сервері обовʼязкова завжди, навіть коли кнопки не видно.
За замовчуванням гейти й політики для неавтентифікованого відвідувача повертають false - навіть не викликаючи метод. Це безпечний дефолт: забута перевірка не відкриє дію гостям.
Щоб метод викликався й для гостя, параметр користувача роблять необов'язковим:
class PostPolicy
{
public function view(?User $user, Post $post): bool
{
if ($post->is_published) {
return true; // опубліковане бачать усі
}
return $user?->id === $post->user_id; // чернетку - лише автор
}
}
Де це потрібно: публічний вміст із винятками - опубліковані статті для всіх, чернетки для автора; файли, частина яких доступна без входу.
Пастка: код усередині має пам'ятати про null - звернення $user->id без ?-> впаде на гостеві.
Для дій, які гостям не дозволені ніколи (редагування, видалення), параметр лишають обов'язковим - тоді Laravel відмовить ще до виклику методу.