Как реализовать безопасность на уровне строк в Java?

В настоящее время я оцениваю фреймворки аутентификации/авторизации.

Apache Shiro кажется очень хорошим, но мне не хватает функций безопасности на уровне строк.

Например. в базе данных могут быть специальные строки, которые должны быть видны и доступны только пользователям с особыми привилегиями. Чтобы избежать ненужных циклов, мы в настоящее время модифицируем SQL-запросы для объединения с нашими данными авторизации, чтобы получить только видимые строки для текущего пользователя.

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

  • Какие решения доступны/возможны?
  • Как вы реализуете безопасность на уровне строк (особенно в сочетании с jpa)?

ОБНОВЛЕНИЕ:

Целевой базой данных в основном является Oracle 10g/11g
, но решение, независимое от базы данных, было бы предпочтительнее, если нет больших недостатков


person MRalwasser    schedule 19.04.2011    source источник
comment
Какова ваша целевая база данных?   -  person Frank Schmitt    schedule 19.04.2011


Ответы (3)


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

Oracle имеет довольно хорошую поддержку безопасности на уровне строк, см., например, http://www.orafusion.com/art_fgac.htm. .

person MeBigFatGuy    schedule 19.04.2011

Мы реализовали его как оболочку JDBC. Эта оболочка просто анализирует и преобразует SQL. Фильтр Hibernate тоже хорошая идея, но у нас много отчетов и специальных запросов, Hibernate — не единственный инструмент для доступа к данным в наших приложениях. jsqlparser — отличный анализатор SQL с открытым исходным кодом, но нам пришлось его разветвить, чтобы исправить некоторые проблемы и добавить поддержку некоторых расширенных функций SQL, например. ROLLUP для целей отчетности https://github.com/jbaliuka/sql-analytic Этот инструмент отчетности также доступен на github, но не зависит от инфраструктуры безопасности на уровне строк https://github.com/jbaliuka/x4j-analytic

person jbaliuka    schedule 24.10.2013
comment
Вы открыли исходный код своей оболочки jdbc? Мне кажется, что jdbc-оболочка на уровне строк была бы лучшим решением. Я попробовал jpasecurity, что выглядит как большое усилие, но его соответствие спецификации JPA сомнительно. - person Nestor Urquiza; 19.05.2014
comment
Я улучшил эту библиотеку для поддержки политик, подобных postgres, это новый код, а не мой внутренний материал для отчетов, но этот новый код должен быть более полезным, поскольку он также поддерживает DML. Я не уверен, что у меня будет время поддерживать его, потому что все основные базы данных уже поддерживают RLS внутри (Postgres, Oracle, MS SQL Server). - person jbaliuka; 12.04.2016

Полезная статья: http://mattfleming.com/node/243

Идея состоит в том, что вы можете реализовать функциональность на уровне строк двумя способами: напрямую установить ограничения в своем репозитории или привязать ограничения через АОП. Последнее предпочтительнее, потому что уровень безопасности должен быть отделен от бизнес-логики (ортогональные проблемы).

В Hibernate вы можете использовать концепцию фильтров, которые применяются прозрачно, и репозиторий не знает о них. Вы можете добавить такие фильтры через АОП. Другой способ — перехватить session.createCriteria() и прозрачно добавить ограничения к критериям с помощью АОП.

person Andrey Minogin    schedule 05.06.2011