Фильтрация данных Spring abac против Spring @PostFilter

Я использую модель ABAC для защиты доступа к некоторым объектам в проекте. Согласно https://dzone.com/articles/simple-attribute-based-access-control-with-spring я могу легко определить некоторые правила политики для обновления/удаления сущностей в проекте. После многих часов поиска я наткнулся на единственный нормально задокументированный способ фильтрации данных, доступных пользователю: использование Spring security @PostFilter. Проблема заключается в производительности этого подхода. Какие есть доступные способы переложить ответственность за фильтрацию данных на базу данных, при этом не смешивая бизнес и логику ролевой модели?

Пока пробовал только кодить JPA Specification: модуль, отвечающий за ролевую модель, учитывает параметры пользователя (id, group_id/organization_id) для составления логических выражений, и добавляются все параметры, по которым нужно фильтровать бизнес чтобы состоять из таких выражений Спецификации. Но это решение вынуждает использовать только спецификацию для поиска данных. Более того, не очень понятно, как хранить эти выражения в хранилище политик.


person Андрей Т    schedule 27.08.2020    source источник
comment
medium.com/@agamgupta1988/   -  person Agam    schedule 23.09.2020


Ответы (1)


Вы затрагиваете аспект, связанный с типами авторизации. Мне нравится разбивать его на 3 типа:

  • функциональная авторизация (можно распечатать?)
  • транзакционная авторизация (могу ли я распечатать документ № 123?)
  • авторизация, ориентированная на данные (перечислите документы, которые я могу распечатать)

Первые 2 типа представляют собой бинарные вопросы «да/нет», и они хорошо масштабируются, т. е. вы спрашиваете об одном элементе/записи и получаете один ответ.

Третий тип сложнее, потому что он больше касается фильтрации, чем авторизации. Представьте, что у вас есть миллион записей. Вы не собираетесь итеративно спрашивать, можете ли вы просмотреть/отредактировать/распечатать данную запись. Это не будет масштабироваться. Что вам нужно сделать, так это обратить процесс вспять и использовать так называемую частичную оценку или обратный запрос.

Некоторые поставщики баз данных (Informatica...) и поставщики авторизации (Axiomatics...) предоставляют возможность динамической фильтрации данных для достижения масштабируемой авторизации. Я бы посмотрел на этот путь.

person David Brossard    schedule 01.09.2020
comment
Спасибо за ответ, думаю стоит познакомиться с реализацией динамических фильтров у этих производителей. - person Андрей Т; 03.09.2020