Как разрешить пользователю обновлять только документ, который соответствует его `_id` в CouchDB?

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

Каждый профильный документ _id будет адрес электронной почты зарегистрированного пользователя, и я смоделировал следующее validate_doc_update функция:

function(newDoc, oldDoc, userCtx, secObj) { 
  var id = userCtx.roles[0].substring(5);
  if (newDoc._id !== id) {
    throw({forbidden: "One can only update one's self document."});
  }
}

Я проверил базу данных, и она работала отлично, как я ожидал. Я правильно понял? Есть ли какой-либо недостаток или нарушение?

(Я использую SuperLogin для создания и входа пользователей)

2 ответа

Да, это жизнеспособное решение. Я бы проверил, чтобы префикс ролей был "user:" просто для безопасности, и, возможно, вы также можете позволить пользователям с ролью "_admin" редактировать любой документ.

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

Ключ здесь - SuperLogin. Создает документ в _users база данных для представления сеанса данного пользователя.

Когда пользователь входит в систему, SuperLogin создает новый сеанс, который вставляет документ, который выглядит следующим образом:

{
   "_id": "org.couchdb.user:iwn9IpwNR4i0wrxmYcGarg",
   "_rev": "1-0f36c9e220c41fe54726cdd01adcdcf2",
   "password_scheme": "pbkdf2",
   "iterations": 10,
   "type": "user",
   "name": "iwn9IpwNR4i0wrxmYcGarg",
   "user_id": "aasaaaaaaaaaaaaaaaaaaaandremiramor@gmail.com",
   "expires": 1458027109739,
   "roles": [
       "user:aasaaaaaaaaaaaaaaaaaaaandremiramor@gmail.com",
       "user"
   ],
   "derived_key": "9a6cfaaac2249ef74fba599c3fbede65a48dcd32",
   "salt": "1ef2689337699061b9460f6f68f63f28"
}

roles Массив также создается SuperLogin с использованием имени пользователя. Так как он был настроен на использование электронной почты в качестве имени пользователя ({emailUsername: true}), электронная почта может быть сопоставлена ​​с соответствующим документом _id,

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