Почти в каждом отдельном веб-приложении есть какие-то «ролевые игры», другими словами — вещи, которые должны быть доступны только для определенной аудитории, пользователей, сегмента пользователей и т. д. Иногда эти требования чрезвычайно сложны, иногда достаточно иметь Флаги «isAdmin», «isCustomerSales», «isPartnerManager» для полного контроля.

Но что, если в вашей системе есть что контролировать, скажем, вы разрабатываете платформу SAAS, которая включает в себя несколько планов подписки или имеет многоуровневую структуру отделов, когда вам нужно предоставить доступ к определенным функциям только для определенных людей. В этом случае наличия флагов «isAdmin», «isPartnerManager» и «isCustomerSales» в базе данных или интерфейсе определенно недостаточно. Конечно, вы можете продолжать бороться с жестко закодированными такого рода условиями во всех возможных местах вашего приложения, но если вы хотите, чтобы ваша система была более гибкой и легко настраиваемой, есть простой способ сделать это.

Итак, хватит прелюдии, давайте перейдем к делу. Здесь мы собираемся создать расширенный менеджер ролей, который покроет 90% того, что может понадобиться вашему приложению.

Технология, которую мы будем использовать в этой статье:

  • База данных MySQL
  • Платформа Laravel
  • Фреймворк Vue.js для FE + пакет @casl/ability npm

База данных

Мы собираемся начать построение нашей системы со следующими таблицами базы данных:

1/ роли

2/ действия

3/ролевые действия

4/ пользовательские роли

Я не буду углубляться в лучшие практики Mysql, например, насколько важно иметь установленные внешние ключи, какой движок таблиц Mysql выбрать и т. д. Моя цель — дать вам представление о том, как построить собственную структуру.

У нас есть список ролей, которые нам нужны в таблице «roles», список действий, которые пользователь должен будет выполнить в таблице «actions», таблица «roleActions», которая связывает эти две роли с помощью отношения ManyToMany (поскольку у роли может быть много действий и действия могут быть привязаны к нескольким ролям). И, наконец, таблица «userRoles» с тем же типом отношений ManyToMany (один пользователь может иметь более одной роли, и роль может быть назначена нескольким пользователям).

Вероятно, у вас уже есть собственная таблица «users», поэтому просто укажите отношение к «userRoles», и все готово.

Применение правил доступа

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

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

Под капотом я, очевидно, создал все необходимые модели и отношения в соответствии с описанной выше структурой базы данных.

Итак, теперь у нас есть данные, поступающие на внешний интерфейс, и нам нужен способ применить наш список доступных действий к приложению VueJS, для этого нам нужно установить следующий пакет https://www.npmjs.com/package /@casl/ability и включить его в наше приложение VueJs.

Здесь следует учитывать две вещи.

1/Нам нужно определить, какое действие разрешено выполнять вашему пользователю. Итак, давайте создадим специальный файл и назовем его «ability.js».

2/ Нам нужно включить наши определенные действия в загрузочный файл VueJs — app.js.

С этого момента приложение Front End имеет все необходимые данные о том, какие действия мы разрешаем выполнять пользователям. И мы можем начать добавлять элементы нашей «ролевой игры» везде, где мы хотим ограничить доступ к определенным функциям. Этого можно добиться, используя переменную «$can», которая доступна из любого места в нашем приложении, поскольку выше мы глобально зарегистрировали ее в нашем файле app.js.

Заключительные слова

Наша головоломка завершена, и теперь у нас есть очень гибкий способ управления доступом к каждой отдельной части вашего внешнего приложения. При внедрении этой технологии в нашу систему вы можете забыть о внесении изменений, связанных с контролем доступа, все, что вам нужно сделать, это создать запись в таблице «роли» и прикрепить необходимые действия из таблицы «действия» через таблицу «ролиДействия». . То же самое относится и к пользователям: достаточно добавить новую запись в таблицу «userRoles», чтобы настроить нового пользователя с уникальным набором правил.