Как реализовать безопасность на уровне строк в Java? - PullRequest
8 голосов
/ 19 апреля 2011

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

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

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

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

ОБНОВЛЕНИЕ:

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

Ответы [ 3 ]

8 голосов
/ 19 апреля 2011

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

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

2 голосов
/ 24 октября 2013

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

0 голосов
/ 05 июня 2011

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

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

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

...