CouchDB - предотвращение несанкционированного чтения

CouchDB имеет механизм для предотвращения несанкционированной записи.

Можно ли также предотвратить несанкционированное чтение?

Ответ 1

Да, CouchDB может предотвратить несанкционированное чтение. К сожалению, это немного менее прямолинейно.

Представьте себе секретное приложение для аукционов. Вы предлагаете 20 долларов США, и я предлагаю 10 долларов США; каждая заявка в документе кушетки. Диван позволяет нам читать наши собственные тендерные документы, но нет других. Однако есть отображение с уменьшением масштаба, показывающее среднее значение. Я загружаю представление и вижу, что средний показатель составляет 15 долларов США, поэтому я пришел к выводу, что ваша ставка составляет 20 долларов США, и я нарушил правила безопасности. В представлении "Вид" могут протекать некоторые или все данные документа. Невозможно обеспечить безопасность на уровне документа. Вот почему доступ на чтение находится на уровне базы данных.

Я знаю, это отстой. Но это единственный правильный, масштабируемый ответ.

Это часть причины, по которой философия Couch заключается в создании множества баз данных, даже одного (или более!) на пользователя. Разрешение на чтение базы данных устанавливается в значении readers объекта базы данных _security. (Обратите внимание, что поле читателей было переименовано в члены в соединительной линии CouchDB, поскольку оно также указывает, кто может писать в БД.)

Техника работает следующим образом:

  • Создайте базу данных для каждого пользователя. Он будет хранить все документы, которые пользователь может прочитать. Добавьте пользователя (или роль пользователя) в объект _security.
  • В основной базе данных создайте функцию фильтра, которая реализует политику чтения. (Он может использовать код с validate_doc_update.)
  • Репликация из основной базы данных в пользовательскую базу данных с помощью ?filter=my_filter_function.
  • Разрешить пользователю загружать (или реплицировать) свою базу данных.

Конечно, это все для чистого приложения Couch, где пользователи напрямую обращаются к Couch. Если у вас есть средний уровень (MVC-контроллер или просто обратный HTTP-прокси), тогда вы можете применять там политику между пользователем и кушеткой. Но будьте осторожны. Например, функция _show или правило _rewrite могут позволить пользователю загружать представление или документ, несмотря на вашу политику.

Удачи!