跨多个用户配置权限和共享域

时间:2017-06-22 17:08:24

标签: ios swift permissions synchronization realm

我使用Realm Swift和Realm Object Server作为我正在处理的应用程序的存储解决方案。我可以使用带有关系数据库的传统服务器,但我真的不需要服务器来做任何实际的工作。我真正需要的唯一后端只是存储和数据同步。 Realm似乎提供了我想要的东西。

到目前为止,我有一个领域的实例。我开始遇到的问题是访问控制。我觉得我可能对Realm可以为我提供的东西有一个根本的误解,并且那里没有大量奇妙的资源。 Realm文档非常详细,但它没有最好的工作示例。

我的应用程序将用于跟踪可用的一组玩家的团队。这组球员将是相对稳定和不变的。然而,团队将经常变化。考虑到这一点,我对我的Realm设置有了以下想法:

  • 包含所有玩家集合的单个领域:/Players。每个用户都应具有对此领域的读取权限,但只有管理员才能进行编写和管理。
  • 应用程序/~/MyRoster的每个用户的单个领域。该领域应该由该用户读/写。我认为用户应该能够授予另一个用户对其领域的临时读/写访问权。
  • 多个用户应该能够组建一个团队,在那里他们可以阅读(并且可能会写入)所有团队用户'名册。

这听起来像是Realm后端的可接受使用吗?我该如何管理中央共享数据池?我应该在注册后立即为用户创建/~/MyRoster域吗?我怎样才能按照我想要的方式配置权限?对我来说,权限结构似乎很奇怪。似乎我可以使用PermissionOffer/PremissionOfferResponse构造来实现我想要的Realm共享。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:7)

感谢您的详细报道。你提出的架构似乎很合适。以下是我的建议:

  1. 对于全局/Players领域,我会在开发中创建它。今天这有点笨拙,因为您必须使用客户端SDK以管理员用户身份打开Realm(因为只有管理员用户可以在其范围/~/目录之外创建Realms)。您可以在应用中创建一个代码路径,如果您以管理员身份登录,则会打开/Players域,然后对该域应用权限更改:
  2. let permission = SyncPermissionValue(realmPath: "/Players",
                                     userID: "*", // To apply to all users
                                     accessLevel: .read)
    user.applyPermission(permission) { error in
      if let error = error {
        // handle error
        return
      }
      // permission was successfully applied
    }
    

    此代码路径不需要多次运行。我们的计划是在仪表板中将这种功能添加到浏览器中,这样您就可以手动创建全局Realm并在不使用客户端SDK的情况下调整权限。

    1. 对于特定于用户的领域,您不需要立即创建它们,因为当用户最终需要时,将会延迟创建领域。我的意思是Realm的设置使你可以在客户端上同步打开一个Realm(启用离线优先功能),然后在客户端同步到服务器的第一次创建之后,服务器是否真正意识到了在其中创建领域。因此,您需要设置客户端代码,以便在必要时在/~/MyRoster打开领域。

      对于向其他用户授予权限,这将使用Swift access control APIs将权限更改应用于用户的Realm并授予对其他用户的访问权限。这可以动态发生,以便用户可以根据需要授予,然后撤销权限。

    2. 关于组的第三部分,我将创建另一个全局领域/Group,它对拥有组表示的所有用户具有读/写访问权限。例如,您可以拥有一个Group对象,其中包含一个链接到User个对象的列表属性,在您的应用程序中每个用户有1 User个。这样每个用户都可以对Realm进行更改,以表示他/她所属的组。

      您可以设置领域功能来监听对/Group领域的更改,以便在将用户添加到组或删除时,该功能将触发对组中各个领域的必要权限更改。

      现在,如果您担心/Group领域的访问控制,您可以设置一个领域功能,该功能使用管理员用户将更改应用于/Groups,并监听用户特定的领域/~/MyRequests用户可以在此Realm中写入一个对象,该对象将触发该功能对组Realm进行更改。通过这种方式,您可以防止未经授权的请求,并将/Group域作为只读管理员的所有用户。