В Laravel есть такая классная фича, как Фасад Gate, позволяющая на уровне любого проекта, созданного на Laravel, задавать определённые правила в соответствии с которыми пользователь может получать права доступа к тому либо иному его функционалу, страницам, блокам.
Рассмотрим возможности Gates в нашем проекте, построенном на экосистеме Laravel Breez и включающем в себя сборку Vue + Inertiajs по умолчанию.
Сама по себе система Laravel Breez дает готовый вариант из коробки, своего рода скелет для построения своего проекта, где уже имеется система регистрации и авторизации, что очень здорово для быстрого старта в development своей CRM системы, тем боле совместно с Vue и Inertiajs
Gate - это ларавеловкий фасад (сервис), отвечающий за проксирование вызовов на Illuminate/Auth/Access/Gate.php через который и реализуется сам механизм определения прав доступа к тому либо иному функционалу создаваемого проекта.
Т.е., если по простому, то мы где-то и как-то задаем в фреймворке условие истинности для определенных/конкретных пользователей. После чего Laravel всегда будет проверять на возможность доступа им к чему-то в нашем проекте.
Как это работает на простом примере.
Мы установили проект Laravel Breez + Vue + Inetiajs.
Определим наше правило доступа для авторизированных пользователей к определённым страницам нашего проекта.
Допустим, разрешим всем зарегистрированным юзерам с уровнем active = 1. В таблице users нашей базы данных мы создали путём миграции такое поле active.
Прописываем правило для данного Gate 'main-admin' в методе boot () провайдера
app/Providers/AuthServiceProvider.php
main-admin – это наименование может быть любым (задаётся разработчиком).
В методе define мы определи значение для поля active модели User(её таблицы) значение 1 при котором Gate 'main-admin' будет определять истинность для данного условия (boolean тип).
Определим, к примеру, что пункты меню в хедере всех страницы для зарегистрированных пользователей будут доступны только тем, у кого active = 1. Пусть это будут вкладки навигации Клиенты и Опции. А для клиентов с уровнем active = 0, доступна только вкладка Кабинет пользователя.
Все запросы для рендера всех наших страниц проекта будут проходить через контроллер UserListController.php (соответствующие маршруты/роуты заданы в web.php)
Файловая структура проекта полностью реализована на компонентах Vue с использованием фасада Inertia.
Сейчас, до реализации прав доступа с различным уровнем active все страницы проекта доступны для всех пользователей.
В основном контроллере (UserListController.php) отвечающем за вывод всех страниц нашего проекта в конструкторе задаем функцию проверки истинности пользователя для всех методов (его функций).
Т.е., если условия Gate соблюдается (если пользователь c active = 1),то в конструкторе данного контролёра переопределяем значение переменной $rights с false на true и передаем её в компонент Vue, который будет выведен при отработке соответствующего метода (маршрута).
Все данные компоненты являются дочерними, родитель которых AuthenticatedLayout.vue есть ничто иное как обертка для них, в которой содержится необходимая нам навигация.
Например, метод index() контролера UserListController.php рендерит компонент Main.vue, который является дочерним для AuthenticatedLayout.vue. По такому принципу отображаются и другие дочерние компоненты для соответствующего маршрута (метода контролера).
Для того чтобы проверить по условию отображать соответствующий пункт меню, передача переменной $rights должна быть принята на стороне родительского компонента (обертки – вышестоящего компонента (AuthenticatedLayout.vue)) в виде props. Поэтому изначально передадим данному компоненту (AuthenticatedLayout.vue) эту переменную.
После чего укажем условия отображения пунктов меню:
Т.е., если значение получаемой переменной в props является истина (true) отображаем пункт меню, и наоборот.
Родительскому компоненту (AuthenticatedLayout.vue), в который вложены все дочерние компоненты и за вывод которых отвечает непосредственно сам контролер, предадим переменную $rights, которая в последующем и будет выведена на его стороне через props.
Теперь проверим, как отображается навигация наших страниц.
Как видим, для пользователя с active = 1, отображается пункты меню Клиенты и Опции и соответствующие им страницы.
Теперь поменяем значение active на 0, в таблице users нашей базы данных.
И проверим, что отобразиться на странице сейчас.
Как видим, имеем только вкладку Кабинет пользователя.
Поняв суть и принцип работы с Gate можно разносторонне подходить к решению многих задач при разработке любого приложения на базе Laravel.