2013-11-25 4 views
1

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

База данных, которую я использую, - это PostgreSQL, которая еще не реализует правила доступа на уровне строк.

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

Любые рекомендации/замечания?

Elie

+0

Вероятно, лучше подходит для dba.SE. –

ответ

1

Имо, контроля доступа является гораздо более удобным для реализации на уровне приложения.

Для всех своих достоинств контроль доступа на уровне базы данных (даже с уровнем строки) не позволит вам легко управлять тернистыми прецедентами, такими как: «разрешить секретарю менеджера маскироваться как менеджер для этого подмножества задач в то время как он займет неделю в следующем месяце ». Придерживайтесь его использования, чтобы пользователь базы данных приложения не нарушал данные.

На уровне приложения обратите внимание на уровень RBAC и ACL немного глубже. Есть несколько хороших реализаций, в комплекте со схемой. Например:

http://symfony.com/doc/current/cookbook/security/acl.html

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

Некоторые (красочные и неоднозначные) колонки принять это шаг вперед: http://vimeo.com/2723800

0

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

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

  1. просмотров барьер безопасности (вы можете использовать триггеры для управления обновлениями)
  2. pg_has_role()

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

Смежные вопросы