Детальные права доступа к записи базы данных (например, группа X и отдельный Смит могут просматривать запись Z)

У меня есть записи (Контакты, Адреса и т. д.), которые должны быть доступны для любого из следующих (включая комбинации, например, 2 группы и 4 человека):

  • Все
  • Члены нескольких групп/отделов
  • Члены одной группы/отдела
  • Несколько лиц
  • Одноместный Индивидуальный

Какова хорошая структура базы данных для реализации этого? По сути, в моем приложении мне нужно иметь возможность ограничить, когда пользователь XYZ вошел в систему, чтобы показать ему только те записи, которые «просматриваются» ему как человеку, члену группы или потому, что они видны всем.

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

Я был бы очень признателен за некоторые советы о том, как это сделать!

Спасибо!

Изменить: я использую SQL Server 2008 Web Edition.


person Alex    schedule 13.09.2009    source источник
comment
Вы решили эту проблему? У меня очень похожая проблема, и было бы неплохо, если бы вы могли рассказать, как вы ее решили. Спасибо!   -  person Orbitum    schedule 17.11.2012


Ответы (2)


Это движение в сторону RBAC — управления доступом на основе ролей. Вы также можете задаться вопросом, следует ли использовать LBAC — управление доступом на основе меток. И, в зависимости от вашей СУБД, могут быть другие способы достижения этого (например, Oracle VPD — виртуальная частная база данных). Все это либо скорее, либо очень специфично для СУБД - разные решения для разных СУБД.

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

Помните, что реляционные СУБД лучше всего работают с множествами. Одна группа — это набор групп с одной группой-членом; один пользователь — это набор групп с одним пользователем-членом. Это означает, что у нас меньше дел для рассмотрения.

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

Основной техникой будет:

  • Создайте базовую таблицу с соответствующим столбцом, чтобы определить набор привилегий, который применяется к каждой строке в таблице.
  • Отменить любой публичный доступ к таблице.
  • Создайте представление в базовой таблице, которое показывает все разрешенные столбцы из базовой таблицы. Это будет представление соединения с управляющей таблицей, которое будет определено в ближайшее время. Условия запроса просмотра также будут зависеть от текущего пользователя.
  • Предоставьте соответствующий доступ к представлению.
  • Создайте соответствующие триггеры INSTEAD OF в представлении для обработки операций вставки, удаления и обновления в представлении, ретранслируя изменения в базовую таблицу.
  • Создайте контрольную таблицу для соединения с базовой таблицей.
  • Заполните его соответствующими данными.
  • Светло-голубой коснитесь бумаги и отойдите подальше.

Теперь о том столбце соединения и контрольной таблице...

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

Существует несколько способов структурирования контрольной таблицы:

  1. Один механизм основан на том, что каждая строка в базовой таблице имеет уникальный идентификатор (который может быть автоматически сгенерированным идентификатором или просто значением первичного ключа). Затем управляющая таблица включает копию этого уникального идентификатора и определяет, какие пользователи или группы могут получить к ней доступ. Это означает, что в таблице управления может быть несколько записей для данной строки, по одной для каждого пользователя или группы, которые могут получить доступ к строке. В этой схеме управляющая таблица имеет внешний ключ, ссылающийся на базовую таблицу.

  2. Другой механизм встраивает идентификационный номер в базовую таблицу, которая является внешним ключом для управляющих таблиц. В основном он идентифицирует набор привилегий, а ссылка в базовой таблице означает, что строка имеет разрешение на доступ, связанное с идентификатором управления доступом. Структура управляющей таблицы может заключаться в том, что идентификатор 0 не имеет доступа ни для кого (через представление), идентификатор 1 имеет доступ для всех, а другие значения обозначают комбинации пользователей и групп — каждая отдельная комбинация имеет другой идентификатор. При этом в наборе управляющих таблиц может быть несколько таблиц, и мы также обсуждаем наличие набора этих управляющих таблиц для каждой защищенной таблицы.

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

Оба они являются административными кошмарами, поэтому вы, вероятно, в конечном итоге получите механизм управления доступом, предоставляемый СУБД, а не универсальное решение SQL.

person Jonathan Leffler    schedule 13.09.2009
comment
Большое спасибо за ваш подробный пост! Что касается контроля доступа, предоставляемого СУБД: я использую SQL Server 2008 Web Edition. Есть ли в нем что-нибудь встроенное, чтобы делать то, что мне нужно? - person Alex; 14.09.2009

Я согласен с Джонатоном по поводу техники, но не обязательно по поводу кошмара. Я реализовал это с помощью единого представления союза прав, основанного на:

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

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

person Gullbyrd    schedule 01.11.2009