how to make better doc/user -specific write permissions in couchDB?

Я играю с CouchDB и PouchDB для проекта, в котором пользователи имеют свою собственную базу данных и могут добавлять друг друга для просмотра или редактирования своих документов.

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

Я не уверен, как правильно это реализовать.

На данный момент мое решение для этого состоит в том, чтобы позволить владельцу БД "подружиться" с другими пользователями и добавить их в качестве участников в db/_security, ограничивая при этом права на запись документом _design, как описано в: https://github.com/pouchdb-community/pouchdb-authentication/blob/master/docs/recipes.md

Но мне нужно сочетание пользовательских и БД конкретных разрешений. Поэтому моя стратегия состоит в том, чтобы позволить пользователю / владельцу добавлять в db / _security специальные роли помимо стандартных "members" и "admins".

Пример:

Пользователь paula владеет базой данных paulas_DB и хочет предоставить пользователю jan право изменять свойство " location " каждого документа. Итак, Паула добавляет jan к members.names в _security и добавляет новый список в _security под названием " movers ":

curl -X PUT $HOST/paulas_DB/_security -d '{"members":{"names":["admin","paula","jan"],"roles":[]},"admins":{"names":["admin","paula"]},"movers":["jan"]}'

документы в paulas_DB имеют следующую структуру:

{
  "_id": "y",
  "_rev": "7-x",
  "owner": "paula",
  "location": "somewhere",
  "name":"thing"
}

теперь там есть проектный документ в ее базе данных, проверяющий, что любой, кто хочет изменить документ в целом, является по крайней мере членом И затем проверяющий, хотят ли они изменить местоположение следующим образом:

function (newDoc, oldDoc, userCtx, secObj) {

// only admins owners or friends of the owner (aka users in the _security members.names list) can edit
if (userCtx.roles.indexOf('_admin') === -1 && oldDoc.owner !== userCtx.name && secObj.members.names.indexOf(userCtx.name) === -1) 
 {
    // next step: add special fields to be either editable or not
    throw({forbidden : "sorry. you are not the owner of this document"});
 }

// only owners users who are also listed within _security.movers can change the location
if (oldDoc.location !== newDoc.location && oldDoc.owner !== userCtx.name && secObj.movers.indexOf(userCtx.name) === -1)
 {
    throw({forbidden : "you are not allowed to change the location of an item, dummie!"})
 }
}

Этот метод, кажется, работает и был довольно прост, но что-то нехорошо, добавляя нестандартные свойства в _security.

Есть ли другой, лучший способ сделать то же самое? Или это приемлемый дизайн для системы разрешений для документов / пользователей?

0 ответов

Другие вопросы по тегам