Во-первых, позвольте мне сказать, что я не считаю, что NHibernate отвечает за безопасность и за редактирование данных на их основе.Я думаю, что вы слишком усложняете это, пытаясь поместить его на уровень доступа к данным.
Я бы вставил слой в сервис или контроллер, который получает этот запрос данных от клиента (который не должен быть репозиторием).сам) и будет выполнять редактирование данных на основе разрешений пользователей.Таким образом, вы выполняете полный запрос к БД, а затем, основываясь на разрешениях пользователя, сервисный уровень очищает поля набора результатов перед возвратом этого набора результатов через соединение службы.Это не самое эффективное решение, но оно более безопасное и более производительное, чем отправка всех данных клиенту и наличие «цензуры» клиентского программного обеспечения.Соединение Ethernet между БД и сервисными уровнями серверной архитектуры может обрабатывать гораздо большую пропускную способность, чем интернет-соединение между сервисным уровнем и клиентом, и в приложении удаленного клиента вы, как правило, очень мало контролируете, что клиент делает с данными;вы могли бы разговаривать со взломанной копией вашего программного обеспечения или аналогом, который не дает двух замечаний по поводу безопасности пользователя.
Если пропускная способность сети между службой и БД имеет большое значение, или если многоинформация ограничена, Linq2NH должен быть достаточно умным, чтобы вы могли указать, что следует или не следует включать в результаты запроса, используя список выбора:
if(!user.CanSeeRestrictedFields)
var results = from p as Repository.AsQueryable<Person>()
//rest of Linq statement
select new Person {
Name = p.Name,
Age = p.Age
};
else
var results = from p as Repository.AsQueryable<Person>()
//rest of Linq statement
select new Person {
Name = p.Name,
Age = p.Age,
SocialSecurityNumber = p.SocialSecurityNumber,
MothersMaidenName = p.MothersMaidenName
};
Я не знаю, достаточно ли умна Linq2NH для анализаусловные операторы в SQL;Я сомневаюсь в этом, но на случай, если это возможно, вы можете указать условные операторы в инициализаторе для полей SSN и MMN в зависимости от того, есть ли у пользователя права на их просмотр, что позволяет объединить эти два запроса.