Authentication 如何授权用户只更新与CouchDB中的“id”匹配的文档?

Authentication 如何授权用户只更新与CouchDB中的“id”匹配的文档?,authentication,authorization,couchdb,pouchdb,cloudant,Authentication,Authorization,Couchdb,Pouchdb,Cloudant,我正在尝试建立一个配置文件数据库模型,其中每个配置文件都对经过身份验证的用户公开,并且每个用户只能更新自己的配置文件 每个配置文件文档\u id都将是注册用户的电子邮件,我模拟了以下验证\u doc\u更新功能: function(newDoc, oldDoc, userCtx, secObj) { var id = userCtx.roles[0].substring(5); if (newDoc._id !== id) { throw({forbidden: "One ca

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

每个配置文件文档
\u id
都将是注册用户的电子邮件,我模拟了以下
验证\u doc\u更新
功能:

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。它在
\u users
数据库中创建一个文档来表示给定用户的会话

当用户登录时,将插入一个如下所示的文档:

{
   "_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"
}

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

是的,这是一个可行的解决方案。为了安全起见,我会检查角色前缀是否为“user:”,也许您还可以允许角色为“\u admin”的用户编辑任何文档

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