# Laravel - Авторизация: Пособие для начинающих

Здравствуйте, будущие разработчики Laravel! Сегодня мы окунемся в захватывающий мир авторизации в Laravel. Не волнуйтесь, если вы новички в программировании - я буду вашим доброжелательным проводником в этом путешествии, объясняя все шаг за шагом. Поехали!

Laravel - Authorization

Понимание основ: Аутентификация vs. Авторизация

Прежде чем мы перейдем к возможностям авторизации Laravel, давайте развеем распространенное заблуждение:

Аутентификация: Кто вы?

Представьте аутентификацию какouncer в клубе. Это все о том, чтобы доказать, кто вы. В цифровом мире это обычно означает вход с помощью логина и пароля.

Авторизация: Что вам разрешено делать?

Теперь авторизация похожа на список ВИП-гостей. Once вы в клубе (аутентифицированы), авторизация определяет, какие зоны вы можете посещать. Можете ли выойти в ВИП-зону? Разрешено ли вам находится за стойкой диджея?

В Laravel сначала мы аутентифицируем пользователей, а затем используем авторизацию для управления тем, что они могут делать в нашем приложении.

Механизм авторизации в Laravel

Laravel предоставляет мощную и гибкую систему авторизации. Давайте разберем ее на понятные части:

1. Шлюзы (Gates)

Шлюзы - это простые, основанные на闭包 способах авторизации действий. Представьте их как КПП в вашем приложении.

Вот как вы определяете шлюз:

Gate::define('edit-post', function ($user, $post) {
    return $user->id === $post->user_id;
});

Этот шлюз проверяет, можно ли пользователю редактировать запись. Он возвращает true, если ID пользователя совпадает с ID автора записи.

Чтобы использовать этот шлюз в вашем контроллере:

if (Gate::allows('edit-post', $post)) {
    // Пользователь может редактировать запись...
}

Или в ваших шаблонах Blade:

@can('edit-post', $post)
    <!-- Показать кнопку редактирования -->
@endcan

2. Политики (Policies)

Политики - это классы, которые организуют логику авторизации вокруг определенной модели или ресурса. Они как специализированные охранники для каждой модели в вашем приложении.

Давайте создадим политику для нашей модели Post:

php artisan make:policy PostPolicy --model=Post

Эта команда создает класс PostPolicy. Давайте добавим в него метод:

public function update(User $user, Post $post)
{
    return $user->id === $post->user_id;
}

Теперь вы можете использовать эту политику в вашем контроллере:

$this->authorize('update', $post);

Или в ваших шаблонах Blade:

@can('update', $post)
    <!-- Показать кнопку обновления -->
@endcan

3. Роли и права

Хотя Laravel не предоставляет встроенную систему ролей, мы можем легко реализовать ее. Вот простой пример:

Сначала добавим столбец 'role' в нашу таблицу пользователей:

Schema::table('users', function (Blueprint $table) {
    $table->string('role')->default('user');
});

Теперь создадим шлюз, который проверяет права администратора:

Gate::define('admin', function ($user) {
    return $user->role === 'admin';
});

Мы можем использовать это в наших контроллерах или视图:

if (Gate::allows('admin')) {
    // Пользователь является администратором...
}
@can('admin')
    <!-- Показать ссылку на панель администратора -->
@endcan

4. Middleware

Laravel также позволяет контролировать доступ на уровне маршрутов с помощью middleware. Давайте создадим custom middleware:

php artisan make:middleware CheckRole

В методе handle этого middleware:

public function handle($request, Closure $next, $role)
{
    if (! $request->user()->hasRole($role)) {
        abort(403, 'Unauthorized action.');
    }

    return $next($request);
}

Зарегистрируйте этот middleware в вашем app/Http/Kernel.php:

protected $routeMiddleware = [
    // ...
    'role' => \App\Http\Middleware\CheckRole::class,
];

Теперь вы можете использовать его в ваших маршрутах:

Route::get('/admin', function () {
    //
})->middleware('role:admin');

Таблица методов

Вот удобная таблица основных методов, которые мы рассмотрели:

Метод Описание Пример
Gate::define() Определяет новый шлюз авторизации Gate::define('edit-post', function ($user, $post) { ... })
Gate::allows() Проверяет, позволяет ли шлюз действие Gate::allows('edit-post', $post)
$this->authorize() Авторизует действие в контроллере $this->authorize('update', $post)
@can Директива Blade для авторизации @can('update', $post) ... @endcan
Gate::forUser() Получает экземпляр шлюза для конкретного пользователя Gate::forUser($user)->allows('edit-post', $post)

помните, что авторизация - это все о контроле того, что могут делать аутентифицированные пользователи в вашем приложении. Это важная часть создания безопасных и удобных веб-приложений.

Пока вы практикуетесь и создаете больше приложений, вы станете более комфортно чувствовать себя с этими концепциями. Не бойтесь экспериментировать - так мы все учимся!

Счастливого кодирования, будущие эксперты Laravel! ??‍??‍?

Credits: Image by storyset