【问题标题】:Realm sync permissions for flexibly-named partitions based on user id基于用户 id 的灵活命名分区的领域同步权限
【发布时间】:2021-09-05 07:50:19
【问题描述】:

我是 Realm Sync(和 Realm)的新手。我正在尝试将 REST / SQL Server 系统转换为 Realm Sync(以避免编写我自己的本地设备缓存代码)。

我有一个简单的配置,只有一个 API 密钥用户和空分区,读写权限设置为 true

但是对于我更复杂的应用程序,我想要更小的子分区来减少需要在本地设备上缓存的数据量,并且我希望子分区能够由客户端动态创建。理想情况下,我希望允许 API 密钥用户连接到名称以用户 ID(或其他一些已知字符串,例如配置文件名称)开头的任何分区。但我找不到将“开始于”条件添加到权限中的方法。

我最好的尝试是尝试将读写同步权限设置为:

{
  "%%partition": {
    "$regex": "^%%user.id"
  }
}

但我的客户端无法连接,说Permission denied (BIND, REFRESH)。 (是的,我尝试使用"$regex": /^%%user.id/,但领域 UI 拒绝了该语法。)领域同步日志显示“用户无权在分区上同步 (ProtocolErrorCode=206)”。 正如您在日志图像中看到的,分区名称与此测试的用户 ID 相同。

我正在尝试做的事情可能吗?如果是这样,我该如何设置同步权限以使其正常工作?

【问题讨论】:

  • 或者我应该将同步权限保留为“true”并依赖我自己的应用程序逻辑?那安全吗?是否可以获得所有可用分区的列表? (如果是后者,那么我认为这不是一个安全的解决方案。)
  • 如果您还没有阅读此Partition Strategy,您应该阅读它,因为它对于理解动态分区至关重要,这就是您正在做的事情。然后阅读Sync Rules,然后回答你的问题Sync Permissions,因为那里有你问的例子。
  • 谢谢。我已经阅读了所有这些页面,但它们并没有那么有用。所有示例都有硬编码的分区名称;我希望能够即时创建新分区。所有,也就是说,除了最后一页上的最后一个例子,它使用了一个函数——但实际上并没有解释在哪里或如何安装这样的函数。除非 - 我可以以某种方式将用户 custom_data 添加到我的领域分区之一吗?然后我可以根据需要添加新的分区名称。但是一旦列表变长,它的可扩展性就不会很好。
  • 我不确定我是否理解这个问题;分区通常是“即时”创建的。例如;如果新用户注册,他们将被分配一个 uid,然后将其用作该用户数据的分区键。这完全是即时的。或者例如,一个聊天应用程序,其中每个聊天都有自己的分区键。同样,这是非常动态的(即时)。查看函数规则部分的示例; "name": "canReadPartition", "arguments": ["%%partition"] 表示 函数从集合中查找用户对分区的权限。这意味着%%partition 可以是任何值。
  • 我想我只是希望可能有更简单的方法。好的,我试试写个函数。

标签: c# .net-core realm


【解决方案1】:

这可以使用函数来完成。如果像我一样,您是 Realm Sync 的新手并且不熟悉 Javascript,请不要担心 - 毕竟,这并不难做到。 (感谢Jay鼓励我尝试!)

我按照Define a Function 页面上的说明创建了我的userCanAccessPartition 函数,如下所示:

exports = function(partition){
  return partition.startsWith(context.user.id);
};

然后我将同步权限设置为:

{
  "%%true": {
    "%function": {
      "name": "userCanAccessPartition",
      "arguments": ["%%partition"]
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多