Подтвердить что ты не робот

Безопасное обключение пула подключений

Я пытаюсь реализовать безопасность на уровне строк, чтобы наше приложение могло обеспечить более строгий контроль доступа.

Одной из технологий, которые мы изучаем, является Oracle Virtual Private Database, которая обеспечивает безопасность на уровне строк, в основном увеличивая все запросы к конкретным таблицам с предикатом предложения where. Поскольку мы находимся в веб-среде, нам нужно настроить специальный контекст внутри Oracle, внутри одного потока запросов. Мы используем пул соединений с учетной записью службы.

Я начал изучать Eclipse Link и Hibernate. Eclipse Link имеет события, которые идеально вписываются в эту модель.

Это приведет нас к миграции из спящего режима, что не является проблемой, но мы были бы привязаны к EL для этих событий.

Oracle, похоже, подразумевает, что они реализуются на уровне источника данных в продукте Web Logic.

Контекст устанавливается и очищается исходным кодом данных WebLogic.

Вопрос: Уместнее ли это сделать на уровне DataSource с некоторыми сериями событий. Каковы события или методы, на которые я должен обратить внимание?

Добавлен вопрос:. Как расширить пул соединений, чтобы безопасно инициализировать контекст оракула с помощью некоторых пользовательских данных? Я копаюсь в Apache, и кажется, что расширение BasicDataSource не дает мне доступа ко всему, что позволило бы мне очистить соединение, когда Spring будет с ним выполнен.

Мне нужно настроить соединение и очистить соединение как выход/введите пул соединений. Я надеюсь на реализацию, которая настолько проста, что никто не может испортить ее, нарушив тонкий баланс продуктов.

- Specifically we are currently using Apache Commons DBCP Basic Data Source

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

4b9b3361

Ответ 1

В конечном итоге я решил свою проблему, расширив некоторые из компонентов Apache.

Сначала я расширил org.apache.commons.pool.impl.GenericObjectPool и переопределил как borrowObject(), так и returnObject(). Я знал тип объектов в пуле (java.sql.Connection), поэтому я мог безопасно использовать их и работать с ними.

Так как для моего случая я использовал Oracle VPD, я смог установить информацию в контексте приложения. Я рекомендую вам прочитать об этом более подробно. Это немного сложно, и существует множество различных опций для скрытия или совместного использования данных на разных уровнях контекста и через узлы RAC. Пуск

В сущности, что я сделал, это генерировать nonce и использовать его для создания экземпляра сеанса в oracle, а затем установить уровень доступа пользователя к переменной в этом сеансе, чтобы затем политика Oracle VPD читала и использовала фильтрация на уровне строк.

Я создал и уничтожил эту информацию в моих переопределенных borrowObject() и returnObject(). Я запустил SQL-код примерно так:

CallableStatement callStat =
                    conn.prepareCall("{call namespace.cust_ctx_pkg.set_session_id(" + Math.random() + ")}");
                  callStat.execute();

Примечание math.random() не является хорошим дополнением.

Далее нужно было просто расширить org.apache.commons.dbcp.BasicDataSource и установить мой пул объектов, переопределив createConnectionPool(). Обратите внимание, что способ, которым я это сделал, отключил некоторые функции, которые мне не нужны, поэтому вам может потребоваться переписать больше или меньше, чем я.

Ответ 2

Вы можете попробовать любой механизм безопасности уровня объекта для простоты, например Spring ACL безопасности.

Ответ 3

Вы захотите сделать это на уровне приложения. Вам понадобится крюк предварительной фиксации и крюк для чтения.

Крючок предварительной фиксации используется для обеспечения того, чтобы данные от клиента представлялись пользователем, уполномоченным изменять эти данные. Это позволяет неавторизованному пользователю переписывать данные, с которыми они не могут получить доступ.

Это не интуитивно, но крюк post post используется для того, чтобы клиент не получал доступ к данным, которые пользователь не должен просматривать. Это происходит после просмотра, потому что это выполняется на уровне приложения, а не на уровне данных. Приложение не имеет возможности узнать, разрешено ли вызывающему лицу получать доступ к данным до тех пор, пока он не будет извлечен из уровня данных. В методе отслеживания отправления вы оцениваете учетные данные для каждой строки, возвращаемой с учетными данными зарегистрированного пользователя, чтобы определить, разрешен ли доступ. Если доступ запрещен в любой строке, тогда будет создано исключение, и данные не будут возвращены клиенту.

Безопасность на уровне приложений, выполняемая таким образом, требует, чтобы у вас был способ подключить каждую строку в таблице к разрешению/роли, необходимой для ее доступа, и способу оценки разрешений пользователя на сервере во время выполнения.

Надеюсь, что это поможет.

Ответ 4

Вы получите лучший контроль, используя один из других источников данных базы данных Commons DBCP. Основной - это просто: базовый:) Те, что находятся в пакете org.apache.commons.dbcp.datasources, дают вам более мелкомасштабный контроль.