dd

RBAC и вытекающие из него приколы

Написано

в

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

Так как важнее было выкатить простейший работоспособный продукт, разработку этой системы было принято немного отложить, пока заказчик сам не начнёт явно указывать на отсутствие разделения по ролям. И вот на этой неделе этот момент настал — поступило сообщение от тестировщиков со стороны заказчика, что пользователи, которые видеть должны только свои сущности, видят все. Долго думал как это всё реализовать и по итогу получилась система из 2.5 шагов для получения данных.
Первый шаг — план минимум. Уровень — контроллер. На контроллер вешается условие — «пользователь должен обладать как минимум одним из следующих разрешений, чтобы запрос прошёл дальше»
Второй шаг — уточнение плана минимум. Уровень — контроллер. У пользователя есть разрешение на просмотр своих документов, но точно ли это его документ?
2.5 шаг — то же самое, что и второй шаг, но действия происходят на уровне класса DataHandler. Пример — поиск документов. У пользователя есть разрешение на просмотр своих документов, значит выборка должна быть изначально сужена до документов, которые привязаны к пользователю.

И на этом моменте получилась интересная концепция — инъекция объектов ActiveQuery (скорее, фабрика, конечно). Я понимаю, что это довольно очевидная идея, но я привык, что через DI подключаются сервисы типа смс, email, кассы, платёжки и тд, а вот что бы у меня был сервис, который мне возвращает сконфигурированные объекты ActiveQuery — это что-то новенькое. По итогу такой сервис мне вернёт, например, объект DocumentQuery, где изначально будет вбит текущий пользователь как создатель документа, так на большее у пользователя прав нет.

С фронтом всё оказалось гораздо проще. Так как на бэке и так повсеместно происходят проверки прав, ничего не мешает просто при авторизации отдавать список всех доступных пользователю разрешений и уже на основе их рисовать кнопки. Подход, очевидно, не идеален, но он максимально прост и не требует каждый раз делать запрос на бэк при рендере страницы, когда нужно понять — можно рисовать кнопку или нет.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *