
Права доступа в Айвико - это матрица: раздел плюс действие. Действий пять - смотреть, создавать, изменять, удалять и отдельное денежное. Права выдаются роли, а конкретному сотруднику можно задать свои - они заменяют права роли. Всё проверяется на сервере, а не только прячется в интерфейсе. Дополнительно доступ ограничивается локацией: сотрудник видит свою точку.
Дело почти никогда не в злом умысле - в цене случайного действия.
Не «админ и все остальные», а матрица по разделам.
От приглашения до первого заказа.
Понять её проще, чем кажется, - и она честнее, чем «уровни доступа».
Схема «администратор, менеджер, гость» ломается в первый же день: приёмщику нужен доступ к заказам, но не к зарплатам, а кладовщику - наоборот. Уровни решают это добавлением новых уровней, и через полгода их девять. Матрица отвечает на вопрос по каждому разделу отдельно, и её не нужно переизобретать под каждую мастерскую.
Смотреть, создавать, изменять, удалять - и денежное действие. Последнее заведено отдельно нарочно: возврат денег клиенту или инкассация - это не «изменение» заказа, а необратимое движение денег. Смешивать их в одном праве значит выдавать право на кассу вместе с правом поправить телефон клиента.
У некоторых разделов действие называется своими словами: в бонусах «удаление» - это «списать», в финансах «создание» - «кассы и приём денег». Общий глагол в таких местах врёт, а человек, который настраивает права, должен понимать, что именно он разрешает.
Там, где деньги, персональные данные или настройки, в редакторе стоит замок. Это не декорация: пометка нужна, чтобы при быстрой настройке новой роли взгляд цеплялся за строки, которые стоит перечитать дважды.

Четыре места, где отсутствие прав стоит денег.
Возврат клиенту, выплата из кассы, перевод между кассами, инкассация. Принимать оплату должны все, кто стоит на стойке; возвращать - один-два человека. Это самое дешёвое ограничение из всех: оно не мешает работе и закрывает самую дорогую ошибку.
Сколько стоила деталь у поставщика - информация, из-за которой чаще всего возникает напряжение в команде и утечка к конкурентам. Мастеру для работы она не нужна: ему нужна цена для клиента и его собственный процент. Закрывается правом на складские и финансовые разделы.
Телефоны, адреса, пароли устройств. Пароль закрыт отдельным правом по умолчанию, и снять маскировку целиком может только владелец. Полная база контактов не нужна мастеру, который чинит аппараты, - и это не недоверие, а обычное правило минимального доступа.
Право удалять стоит оставлять администратору. Не потому, что кто-то удалит нарочно, а потому, что кнопка «удалить» находится рядом с кнопкой «закрыть», и в конце смены руки делают это сами. Восстановление удалённого - всегда дороже, чем лишний щелчок при согласовании.
Три слоя, которые работают вместе.
Настраивается один раз: приёмщик, мастер, кладовщик, кассир, администратор точки. Новый сотрудник получает роль, а не набор галочек, собранный по памяти. Когда через год вы решите, что приёмщикам больше не нужен доступ к отчётам, это меняется в одном месте, а не у восьми человек.
Конкретному человеку можно выдать больше или меньше, чем роли. Важная деталь: личные права именно заменяют, а не дополняют - явный запрет побеждает разрешение роли. Так можно оставить опытному мастеру доступ к складу, не открывая его всей роли, и наоборот, закрыть что-то одному человеку.
Даже с полными правами сотрудник видит только свою точку: её заказы, кассу, склад. Для сети это важнее матрицы прав: чаще всего проблема не в том, что администратор что-то может, а в том, что он видит выручку и клиентов соседнего филиала.
Роль, права, почту и пароль владельца меняет только он сам или другой владелец. Администратор с правом на сотрудников не может понизить владельца или перехватить компанию. Без этого правила право «редактировать сотрудников» означало бы захват мастерской.

Техническая деталь, от которой зависит, настоящее ли ограничение.
В самодельных системах ограничение доступа часто сводится к тому, что кнопка не показывается. Запрос при этом можно отправить мимо интерфейса, и сервер его выполнит. Это не теоретическая уязвимость: именно так утекают выгрузки клиентских баз.
Право проверяется на сервере при каждой операции - и на изменение, и на чувствительное чтение. Если права нет, ответ будет отказом независимо от того, что показывал интерфейс. Интерфейс при этом тоже прячет недоступное: видеть кнопку и получать отказ - плохой опыт.
Если сотруднику закрыт раздел, у него не должно быть ни пункта в меню, ни адреса, по которому раздел открывается. Иначе галочка в матрице вводит в заблуждение: владелец думает, что закрыл, а человек просто заходит по ссылке.
Отключение сотрудника закрывает доступ сразу, включая уже открытые сессии и подключения. Это важнее, чем кажется: человек, узнавший об увольнении, и человек, у которого ещё работает вкладка с базой клиентов, - разные ситуации.
Порядок, при котором ничего не сломается.
Не «что разрешить», а «что случится, если человек ошибётся». Ответ быстро отделяет важное от неважного: ошибка в телефоне клиента правится за секунду, ошибочный возврат денег - нет. Настройка прав по этому принципу занимает полчаса вместо вечера.
Не выдумывайте должности, которых нет. Если у вас два человека и оба делают всё, роль нужна одна, и закрыть в ней стоит только деньги и удаление. Матрица на восемь ролей в мастерской из трёх человек - это работа ради работы.
Зайдите под сотрудником и пройдите его обычный день: принять заказ, добавить запчасть, выдать, принять оплату. Половина проблем с правами обнаруживается именно так - оказывается, для обычной работы человеку не хватает одного разрешения, и он идёт к владельцу каждый раз.
Каждый новый человек - повод посмотреть, не раздали ли лишнего «чтобы не мешало». Обычно за год доступ расширяется молча: кому-то открыли на время, и так и осталось. Пересмотр раз в полгода занимает десять минут и возвращает всё на место.