如何授权用户只更新与CouchDB中的`_id`匹配的文档?

时间:2016-03-14 07:27:29

标签: authentication authorization couchdb pouchdb cloudant

我正在尝试为配置文件数据库建模,其中每个配置文件对于经过身份验证的用户都是公开的,并且每个用户只能更新他/她自己的配置文件。

每个个人资料文档_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 个答案:

答案 0 :(得分:1)

是的,这是一个可行的解决方案。我要检查角色前缀是否为" user:"为了安全起见,也许你也可以允许用户担任角色" _admin"编辑任何文件。

您的解决方案可能存在的一个问题可能是,如果您使用电子邮件作为ID,则可能会公开所有用户的电子邮件地址。但是,如果您在特定用例中对此表示满意,那么您的解决方案就可以了。

答案 1 :(得分: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": "aasaaaaaaaaaaaaaaaaaaaandremiramor@gmail.com",
   "expires": 1458027109739,
   "roles": [
       "user:aasaaaaaaaaaaaaaaaaaaaandremiramor@gmail.com",
       "user"
   ],
   "derived_key": "9a6cfaaac2249ef74fba599c3fbede65a48dcd32",
   "salt": "1ef2689337699061b9460f6f68f63f28"
}

roles数组也由SuperLogin使用用户名创建。由于我已将其配置为使用电子邮件作为用户名({emailUsername: true}),因此电子邮件可以与相应的文档_id匹配。