【问题标题】:How to authorize user to update only a document that matches his `_id` in CouchDB?如何授权用户仅更新与他在 CouchDB 中的`_id` 匹配的文档?
【发布时间】:2016-06-29 03:33:25
【问题描述】:

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

每个profile文档_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 来创建和登录用户)

【问题讨论】:

    标签: authentication authorization couchdb pouchdb cloudant


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这里的关键是 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。

      【讨论】:

        猜你喜欢
        • 2019-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-23
        • 2011-04-30
        相关资源
        最近更新 更多