CouchDB ACL 交叉引用文档

发布于 2024-11-24 19:55:03 字数 512 浏览 0 评论 0原文

假设我有两种类型的文档,其中一种引用另一种,例如“orders”和“order_replies”,后一种文档有一个字段“ref”,其中包含订单文档的 ID。

对于我的 validate_doc_update 函数,我希望用户只有在是原始订单的作者时才能够更改 order_reply 文档。

如何在函数中从 ID 为 newDoc.ref 的订单中获取“作者”字段?

这是到目前为止我的验证函数的一部分:

if(userCtx.roles.indexOf('employee') >= 0) {
  // [...] other doc types
  if (newDoc.type == 'order_reply') {
    //newDoc.ref.author is not the proper approach
    require((userCtx.name == newDoc.ref.author), "this is not your order reply!");
  }
}

Let's say I have two types of docs with one referencing the other, e.g. "orders" and "order_replies" the later one having a field "ref" which contains an ID of an order document.

For my validate_doc_update function I want a user only to be able to change an order_reply document if he is the author of the original order.

How can I get the "author" field from the order with the ID newDoc.ref within the function?

Here's a part of my validation function so far:

if(userCtx.roles.indexOf('employee') >= 0) {
  // [...] other doc types
  if (newDoc.type == 'order_reply') {
    //newDoc.ref.author is not the proper approach
    require((userCtx.name == newDoc.ref.author), "this is not your order reply!");
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

巴黎盛开的樱花 2024-12-01 19:55:03

将作者 ID 放入订单 ID 中。例如:

  • 订单: { "_id": "order/jack/1", ... }
  • 订单回复: { "ref": "order/jack/1", ... }

因此,您可以检查:

if (userCtx.roles.indexOf('employee') !== -1) {
  if (newDoc.type === 'order_reply') {
    require(userCtx.name === newDoc.ref.split('/', 3)[1], "this is not your order reply!");
  }
}

如果您有多个作者,请使用 "order/author1/author2/.../authorN/ordernum" 作为 _id 并检查:

var parts = newDoc.ref.split('/'),
    authors = parts.slice(1, -1);
require(authors.indexOf(userCtx.name) !== -1, "this is not your order reply!");

更新:由于错误COUCHDB-1229,请使用doc._id 中的“/”可能会导致问题。根据您的用例,最好使用其他分隔符,例如“:”。

Put the author's ID in the order's ID. For example:

  • The order: { "_id": "order/jack/1", ... }
  • An order's reply: { "ref": "order/jack/1", ... }

So you can check with:

if (userCtx.roles.indexOf('employee') !== -1) {
  if (newDoc.type === 'order_reply') {
    require(userCtx.name === newDoc.ref.split('/', 3)[1], "this is not your order reply!");
  }
}

If you have multiple authors, use "order/author1/author2/.../authorN/ordernum" as _id of the order and check with:

var parts = newDoc.ref.split('/'),
    authors = parts.slice(1, -1);
require(authors.indexOf(userCtx.name) !== -1, "this is not your order reply!");

UPDATE: Due to bug COUCHDB-1229, use of "/" in doc._id may cause problems. Depending on your use-case, it may be better to use another separator, e.g. ":".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文