Laravel 5 Введение в Laravel Auth Gates

Laravel 5

laravel

Введение в Laravel Auth Gates

На основе статьи https://laravel-news.com/authorization-gates

Laravel Gate представляет собой элегантный механизм для управления доступа пользователей к ресурсам и разрешения действий над ними.

До версии 5.1 программисты обычно использовали такие ACL пакеты как Entrust и Sentinel на ряду с посредниками (middlewares) для авторизации. Недостаток таких решений в том, что разрешения, которыми вы наделяете пользователей, являются всего лишь флагами. В некоторых случаях они не позволяют кодировать сложную логику, поэтому мы вынуждены были дописывать реальную проверку доступа в контроллерах.

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

Пример работы с Laravel Gate

В этой статье мы создадим приложение для публикации статей. Для пользователей будут предусмотрены две роли (авторы и редакторы) со следующими правами:

-авторы могут создавать статью;
-авторы могут редактировать свои статьи;
-редакторы могут редактировать любые статьи;
-редакторы могут опубликовывать статьи.

Создание проекта

Сначала создадим новый проект Laravel 5.4.

Если вы установили Laravel installer, то

Иначе

Базовая настройка

Создадим базу данных (например, blogbase с utf8mb4_unicode_ci) и укажем параметры доступа в .env файле (для openserver это root и пустой пароль по умолчанию):

Таблицы базы данных

Далее создадим модель Post через консоль:

Параметры -m и -c дополнительно создают миграцию и контроллер для модели.

Далее в файле миграции добавим строки в up-метод:

Нам понадобятся еще таблица roles и сводная (pivot) таблица user_roles. Мы планируем указывать права в таблице roles аналогично пакету Sentinel.

 

 

 

Генерация тестовых данных

 

И не забудем вызвать RolesSeeder из DatabaseSeeder:

Модели User и Role

Мы не может запустить генерацию без настройки моделей. Давайте добавим fillable-поля в app/Role модель, укажем тип permissions и создадим отношения между app\Role и app\User моделями.

 

И вот теперь мы можем запустить миграцию с генерацией:

Авторизация

Laravel позволяет без лишних усилий получить controllers, routes и views для стандартной системы авторизации с помощью команды:

Регистрация

Далее мы должны в форме регистрации добавить выбор роли пользователя.

В Controllers/Auth/RegisterController.php переопределим метод showRegistrationForm:

Добавим select в resources/views/auth/register.blade.php:

Осталось добавить валидацию для нового поля. Для этого изменим метод validator в RegisterController:

Переопределим метод create в контроллере (этот метод трейта RegisterUsers) и добавим роль к зарегистрированному пользователю.

Изменим редирект в RegisterController и в LoginController:

Запуск приложения

После запуска сервера (с помощью php artisan serve, например), вы сможете регистрировать нового пользователя с указанием его роли прямо в браузере (ссылка на форму регистрации .../register).

Определение политик

Изменим app/Providers/AuthServiceProvider.php:

Routes

Изменим routes/web.php:

Модель Post

Определим fillable-поля, добавим scope и связи:

PostController

Добавим метод index для отображения списка всех опубликованных статей:

Далее изменим resources/views/home.blade.php и переименуем в resources/views/posts/index.blade.php:

Если мы посещаем страницу со статьями в гостевом режиме, то мы не должны видеть кнопку new.

Создание статей

Добавим метод create в PostController:

Создадим файл posts/create.blade.php:

Далее добавим метод store для сохранения статьи. Дополнительно нам потребуется создать StorePost для валидации с помощью команды php artisan make:request StorePost.

Файл app/Http/Requests/StorePost.php:

Черновики

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

Для показа черновиков добавим метод drafts в PostController:

И создадим вид posts/drafts.blade.php:

Еще нам необходимо добавить ссылку в layouts/app.blade.php для доступа к черновику:

Редактирование статей

Давайте добавим возможность редактировать и публиковать статьи. Новые методы в PostController:

Дополнительно создадим UpdatePost с помощью php artisan make:request UpdatePost.

Теперь вид posts/edit.blade.php:

Публикация черновиков

Для простоты мы сделаем публикацию через get-запрос. Добавим метод publish в PostController:

Показ статьи

Добавим метод show в PostController:

И вид posts/show.blade.php:

404

Добавим еще один вид errors/404.blade.php для сообщения о несуществующей странице и возможности перехода на предыдущую страницу:

Итоги

Наше приложение позволяет пользователям выполнять только те действия, на которые у них есть разрешения. При этом мы не использовали никаких сторонних пакетов. И самое важное: мы отделили логику доступа от бизнес-логики. Если вдруг ACL спецификации изменятся, нам не придется изменять контроллеры.

Перевод И.Колемаев

все материалы по Laravel 5