Я играю с 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.
Есть ли другой, лучший способ сделать то же самое? Или это приемлемый дизайн для системы разрешений для документов / пользователей?