2016-03-14 1 views
0

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

ответ

0

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

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

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

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

1

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

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

Смежные вопросы