2013-05-20 7 views
1

Я пытаюсь принудить существующее приложение NHibernate к чему-то вроде приложения с несколькими арендаторами. Модель данных довольно велика (60+ объектов), хотя требуется лишь небольшое подмножество этих объектов. В качестве дополнительной морщины модель доступа к данным используется в отдельных приложениях, которые должны игнорировать безопасность.Защита/фильтрация объекта NHibernate

С этой целью я создал дополнительные сущности, которые представляют ACL на защищаемых объектах.

Мне удалось получить что-то похожее на безопасность, добавив слушателя LoadCollection. Когда загружен набор защищенных объектов, я проверяю ACL для каждого из них и удаляю его из списка, если доступ запрещен.

Однако я не могу понять, как выполнить одно и то же при загрузке одного объекта. У меня есть прослушиватель событий PreLoad, и я могу определить, имеет ли вызывающий объект доступ. Если у них нет доступа, я хотел бы вернуть нулевой элемент. Я попытался настроить сущность, связанную с событием, на null и выдворить сущность из сеанса.

Документация об использовании этого мероприятия довольно тонкая на земле: в основном это события, которые срабатывают перед сохранением, которые сработали. В поваренной книге NHibernate используется очень старая версия NHibernate с другой сигнатурой для событий (например, они возвращают bool, а не пустоту NHibernate 3.3.x).

Edit: После спелеология через источник NHibernate, я определил, что я смотрел на неверном событие Load. Я попробовал «PreLoad» и «PostLoad», не понимая, что обычное старое событие «Загрузить» было тем, чем я был.

Это подняло новый вопрос: При загрузке объекта, который не защищен, но имеет защищенного родителя, мой прослушиватель событий загрузки будет запускаться для прокси-сервера родителя. При загрузке или без загрузки родительский прокси не будет иметь правильный ACL: каждый раз он становится пустым.

ответ

2

Хороший полный пример для приложения NHibernate, использующего эту конструкцию, можно найти в NHibernate best practices, мы используем его для корпоративного тяжелого веб-приложения с более чем 300 объектами с большим успехом. Кроме того, мы внедрили механизм управления контекстом, каждый конечный пользователь запрашивает маркер безопасности при входе в систему и использует его для каждого последовательного вызова, при каждом последовательном вызове мы проверяем токен безопасности для проверки и используем его для создания дополнительного критерий, который ограничивает доступ каждого пользователя в зависимости от его конфигурации. Это был большой проект, но он дал нам хорошую инфраструктуру для разработки и обслуживания.

Смежные вопросы