Как реализовать контроль доступа к базе данных на основе строк - PullRequest
2 голосов
/ 14 июля 2009

В настоящее время я разрабатываю приложение для базы данных малого бизнеса, для которого мы планируем перейти на многопользовательский доступ в следующий раз.

База данных в основном содержит проекты (в таблице проектов) с парой соединенных таблиц, содержащих дополнительную информацию.

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

Что несколько усложняет ситуацию, так это то, что доступ к базе данных в основном происходит на собственном уровне персистентности, который создает необходимые SQL-запросы (напоминающие nhibernate).

Единственное решение, которое я мог бы предложить, - это реализовать хранимые процедуры (или представления для доступа на чтение?) Внутри базы данных, которые реализуют проверки доступа. Поскольку наш уровень постоянства в настоящее время полагается на полный доступ к таблицам, это будет означать реализацию представления чтения, одну команду вставки и одну команду удаления для каждой таблицы и изменение уровня сохранения для использования этих команд (вместо создания запросов INSERT / DELETE) ,

Мне интересно, есть ли другое решение, не требующее изменения нашего кода ...

Ответы [ 2 ]

1 голос
/ 14 июля 2009

Один простой (но грубый) подход заключается в создании VIEW для каждой группы пользователей с использованием WITH CHECK OPTION. Вам также могут понадобиться триггеры INSTEAD OF на этих VIEW с, чтобы разрешить более сложную логику для операций INSERT, UPDATE и DELETE.

1 голос
/ 14 июля 2009

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

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

Возможно, вы сможете организовать передачу одной дополнительной информации в хранимые процедуры. В зависимости от версии SQL Server это может быть фрагмент XML или табличный параметр. Он будет включать всю информацию, необходимую для определения доступа, который должен иметь пользователь. Может быть, просто идентификатор пользователя, но кто знает?

Вы хотите создать представления и / или табличные функции, которые использовали бы эту информацию для фильтрации набора строк, возвращаемых на основе доступа.

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