MongoDB领域和SwiftUI中的复杂字段级权限

a1o7rhls  于 2022-11-22  发布在  Go
关注(0)|答案(1)|浏览(159)

我正在使用MongoDB Realm Swift SDK和应用程序后端。我正在使用@ObservedResults属性 Package 器访问视图中的Realm对象。
我需要为一个名为Procedure的协作文档设置权限。该文档由所有者创建,所有者可以邀请其他用户(* 主管 )对其进行评论并签署。
只有主管可以写他们的响应,只有所有者可以写其他字段,尽管每个字段都应该能够读取其他字段的内容(
私人注解 * 除外,主管应该看不到它)。
我在下面的类定义中对权限进行了注解。

class Procedure: Object {

    // ID
    @Persisted(primaryKey: true) var _id: ObjectId

    // Owner (this is unique per user)
    @Persisted var ownerID: String

    // Read/write by owner. Read by supervisor.
    @Persisted var title: String
    @Persisted var body: String

    // Private notes - Read/write by owner, invisible to supervisor
    @Persisted var privateNotes: String

    // Supervisor - this is the user ID of the supervisor
    @Persisted var supervisorID: String?

    // Supervisor response - Read/write by supervisor. Read by owner
    @Persisted var supervisorResponse: String?
}

extension Procedure: Identifiable {
    
    var id: String {
        self._id.stringValue
    }
}

我正在使用 Flexible Sync 并尝试设置以下权限文档。

{
  "rules": {
    "Procedure": [
      {
        "name": "supervisor_restricted_read",
        "applyWhen": {
          "supervisorID": "%%user.id"
        },
        "fields": {
          "privateNotes": {
            "read": false,
            "write": false
          }
        },
        "additional_fields": {
          "read": true,
          "write": false
        }
      },
      {
        "name": "owner_read_write",
        "applyWhen": {},
        "read": {
          "ownerID": "%%user.id"
        },
        "write": {
          "ownerID": "%%user.id"
        }
      }
    ]
  },
  "defaultRoles": []
}

但是,使用这些权限,我仍然只能获得与@ObservedResults中的ownerID匹配的Procedure示例(而不是supervisorID与当前用户ID匹配的示例)。
我认为我使用的权限不正确!

v8wbuo2f

v8wbuo2f1#

在进一步阅读文档时,一个用户一次只能有一个会话角色。由于一个用户可以同时是(不同文档的)所有者和监督者,我尝试将权限滚动到一个角色中,使用 OR predicate ,这似乎很有效!

{
  "rules": {
    "Procedure": [
      {
        "name": "owner_supervisor_procedure_permission",
        "applyWhen": {},
        "read": {
          "$or": [
            {
              "ownerID": "%%user.id"
            },
            {
              "supervisorID": "%%user.id"
            }
          ]
        },
        "write": {
          "ownerID": "%%user.id"
        }
      }
    ]
  },
  "defaultRoles": [
    {
      "name": "owner-read-write",
      "applyWhen": {},
      "read": {
        "ownerID": "%%user.id"
      },
      "write": {
        "ownerID": "%%user.id"
      }
    }
  ]
}

相关问题