Как разрешить пользователю обновлять только документ, который соответствует его `_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
,