Фон
У нас есть приложение WinForms с программным кодом Entity Framework 4.2 / FluentAPI с использованием SQL Server 2008 R2.
Безопасность - это пользовательская реализация IPrincipal
и IIdentity
с ролями для пользователя. Эти роли проверяются, когда отображается форма / меню / кнопка, и она будет отключена / удалена в зависимости от роли пользователя.
Пользователи проходят проверку подлинности в базе данных, поэтому для подключения нет «главного» пользователя: оно создается с использованием имени пользователя / пароля, указанных на экране входа в систему.
Итак, доступ к данным (общий) работает.
Проблема
Но в некоторых случаях мне может потребоваться отключить доступ к определенной таблице или столбцу внутри таблицы.
Некоторые тесты показали здесь, что IGenericRepository.Find<MyCustomType>(_idToFind)
(который возвращает полную сущность) завершится ошибкой, потому что нет доступа к одному столбцу, и SQL-сервер предотвратит весь оператор выбора.
Я обнаружил, однако, что создать запрос, как
IGenericRepository.All<MyCustomType>().Select(_c => _c.JustASingleField)
будет работать, потому что сгенерированный запрос будет искать только определенное поле, к которому у меня есть доступ.
Вопрос
Есть ли способ для меня создавать запросы, которые будут с учетом ролей к базе данных?
Например: Find<MyCustomType>(id)
вернет объект как обычно, но с полем, к которому у пользователя нет доступа, равным NULL или без значения?
Или мне просто нужно написать «общие» запросы для каждого отдельного элемента, который не требует защиты, и использовать систему безопасности для полного блокирования доступа к ресурсу?
Другим примером может быть заполнение сетки, но столбец, к которому у пользователя нет доступа, будет пустым.
Возможно ли вообще использовать Entity Framework?