Безопасность на уровне строк с Entity Framework - PullRequest
10 голосов
/ 04 октября 2008

Я пытался рассмотреть, как безопасность на уровне строк может быть реализована с помощью Entity Framework. Идея состоит в том, чтобы иметь независимые от базы данных средства, которые предлагали бы методы для ограничения строк, поступающих из ObjectContext.

Некоторые из моих первоначальных идей были связаны с изменением частичных классов, созданных инструментом EDMGEN, и это оказало некоторую ограниченную поддержку. Пользователи по-прежнему могут обойти это решение, используя свои собственные операторы eSQL и QueryObject.

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

Ответы [ 5 ]

10 голосов
/ 08 октября 2008

Конечно, вы можете сделать это. Важная вещь, которую нужно сделать, - это заблокировать прямой доступ к контексту объекта (не позволяя пользователям создавать свои собственные ObjectQuery) и вместо этого дать клиенту более узкий шлюз для доступа и изменения объектов. Мы делаем это с помощью шаблона Entity Repository . Вы можете найти пример реализации этого шаблона для структуры сущностей в этом блоге . Опять же, ключ блокирует доступ к контексту объекта. Обратите внимание, что класс контекста объекта является частичным. Таким образом, вы должны быть в состоянии предотвратить «несанкционированные» способы его создания, а именно, вне вашей сборки репозитория.

Однако, есть тонкости, которые необходимо учитывать. Если вы реализуете защиту представления на уровне строк для определенного типа сущности через шаблон хранилища, то вы должны рассмотреть другие способы, с помощью которых клиент мог бы получить доступ к тем же сущностям. Например, через навигационные отношения. Возможно, вам придется сделать некоторые из этих отношений частными, что вы можете сделать в своей модели. У вас также есть возможность , указав пользовательский запрос или хранимую процедуру для загрузки / сохранения объектов. Хранимые процедуры, как правило, зависят от сервера БД, но SQL можно написать в общем виде.

Хотя я не согласен с тем, что это невозможно сделать с помощью Entity Framework, я согласен с комментариями «сделай это на сервере БД», поскольку вам необходимо реализовать глубокую защиту .

2 голосов
/ 04 октября 2008

Место, где вы добавляете безопасность, зависит от того, от кого вы пытаетесь обезопасить себя.

Если, например, вы защищаете веб-сайт, то будет достаточно добавить фильтрацию на уровне контекста, поскольку в этом случае «пользователи» находятся на веб-сайте. У них нет иного выбора, кроме как пройтись по вашему контексту, поскольку вы написали бы приложение полностью против контекста.

В вашем случае кажется, что «пользователи», от которых вы пытаетесь обезопасить себя, - разработчики. Это немного сложнее. Если разработчики не имеют доступа для внесения изменений в саму базу данных, вам придется поставить защиту на уровень базы данных. Никакой объем доступа к eSQL не сможет обойти базу данных, сказав «нет».

1 голос
/ 15 марта 2012

Вы можете найти эту статью полезной:

http://msdn.microsoft.com/en-us/magazine/ff898427.aspx

«Запретить доступ таблиц к платформе сущностей, не вызывая мятеж»

1 голос
/ 07 октября 2008

То, что вы пытаетесь достичь, по определению невозможно.

Если безопасность не обрабатывается явно базовым приложением базы данных (SQL Server, Oracle и т. Д.), То стандартные инструменты, такие как SQL Management Studio, прорвутся прямо за ней.

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

0 голосов
/ 12 февраля 2016

Я нашел способ сделать это, используя Postgres и расширение под названием Veil . На самом деле он работает (предназначен для) с использованием Views для всех операций (выбор, обновление, удаление, вставка) и проверкой разрешений в пунктах WHERE. Но Veil просто добавляет математические данные для эффективного управления информацией о разрешениях в памяти, а не запрашивает ее каждый раз. Так что с Veil, хотя вы подключаетесь напрямую к СУБД, вам предоставляется только доступ на уровне строк.

Я каким-то образом модифицирую свой стиль с помощью вуали, например, я начал использовать Triggers вместо Views для применения ограничений разрешений.

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

Т.е.: вы делаете запрос select * from table и получаете именно то, что вы намерены (говоря на уровне строк).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...