как сделать лучше doc / user-specific разрешения на запись в couchDB? - PullRequest
0 голосов
/ 11 мая 2018

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

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

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

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

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

Пример:

Пользователь 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.

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

...