Фильтрация данных на основе DSL - PullRequest
2 голосов
/ 17 января 2012

Наш продукт является специфическим для домена. Вот некоторые из типичных случаев использования безопасности:

  1. Обычный пользователь может редактировать только данные своего профиля или данные кого-либо на основании разрешения
  2. Пользователь может видеть только данные, принадлежащие его отделу, в то время как другой пользователь может просматривать данные из всех отделов

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

Мы используем фильтрацию на основе критериев Hibernate и хотели бы добавить дополнительные ограничения на основе некоторых выражений, связанных с разрешением.Выражение для варианта использования 1, упомянутое выше, может выглядеть следующим образом: 'userId=user.userId', где «пользователь» является ключевым словом и представляет текущего аутентифицированного пользователя, а «ИД пользователя» является свойством объекта, для которого создаются критерии.

Мы хотим определить dsl, используя который мы можем вывести ограничение критериев, а также предложение where для sql.

Существуют ли какие-либо фреймворки, которые позволят нам сделать это, не переходя на dsl?Основываясь на вышеупомянутых случаях использования, думаете ли вы, что это может быть достигнуто другим способом?

Дополнительная информация: Мы определяем только доменные объекты с некоторой метаинформацией для создания пользовательского интерфейса.Стойкость, безопасность и т. Д. Обеспечиваются нашей основной структурой.

Ответы [ 2 ]

2 голосов
/ 22 января 2012

Вы тестировали фильтры Hibernate? Они являются отличным механизмом фильтрации на уровне записей, вы можете определить несколько фильтров (например, два фильтра для вашего случая) для каждой сущности и включить или отключить их в соответствии с текущим пользователем. Следует упомянуть, что фильтры могут принимать параметры (например, ваш текущий идентификатор пользователя).

Мы использовали эту замечательную особенность Hibernate 3 в большом проекте, который имел иерархическую организационную единицу и работал нормально.

Кстати, если вы используете Oracle в качестве базы данных, рассмотрите возможность виртуальной частной базы данных Oracle.

1 голос
/ 29 января 2012

Мы решили пойти с нашим собственным dsl, используя antlr

...