Авторизация на уровне запросов к БД
Наткнулся на интересный прием для авторизации SQL-запросов: добавлять к каждому запросу join к табличкам из RBAC. Т.е. в каждый запрос прокидывается пользователь, и результаты выборки дополнительно фильтруются с учетом имеющихся у пользователя привилегий. Например, если идет запрос в таблицу с публикациями, то добавляется условие, что в таблице привилегий у пользователя либо полный доступ, либо есть доступ к таблице публикаций. Если доступ есть — то будет нормальный ответ с публикациями, если нет — пустой результат.
На первый взгляд выглядит, как костыль: авторизацию лучше делать на более верхнем слое логики (а то так можно и до хранимых процедур дойти). Вдобавок, ломается логика: ошибка авторизации неотличима от пустого ответа. Но я, наверно, слишком привык к мандатной модели доступа, когда есть всего несколько уровней привилегий (например, читатель, писатель, админ).
Есть как минимум три нюанса, при возникновении которых эта схема будет иметь смысл.
- Экономия количества походов в таблицы. Можно привести такой пример: с публикациями мы должны проверить, что есть право публиковать вообще (пользователь не read-only), что человек состоит в канале, что у него есть роль админа-публикатора. Если авторизацию контролировать на более высоком уровне, то в примере, в зависимости от организации БД, могут быть запросы к трем и более таблицам.
- Устаревание настроек привилегий из-за неатомарности операций. Есть транзакции, да, но не всегда получится все делать в рамках одной транзакции. А тут все права проверяются в рамках одного запроса.
- Мультитенантные системы (одна база с кучей пользователей). Конечно, это обычно звоночек про то, что данные организованы/изолированы не очень хорошо, но обстоятельства разные бывают, и иногда data access control необходим.
Вообще, приятнее конечно работать с простой моделью доступа. Она тупо удобнее и проще в реализации. Если цена ошибочного действия не очень высока и/или оно относительно легко поправимо, то достаточно будет просто добавить аудит. Применение супергранулярным системам доступа я вижу только в критичных системах (банки, ИБ) и бигдате. Да и даже там это не гарантия качества и безопасности — кожаные мешки умеют ошибаться назло всем ограничениям.