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

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

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

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

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

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

ОБНОВИТЬ:

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

3 ответа

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

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

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

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

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

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

Другие вопросы по тегам