我使用Realm Swift和Realm Object Server作为我正在处理的应用程序的存储解决方案。我可以使用带有关系数据库的传统服务器,但我真的不需要服务器来做任何实际的工作。我真正需要的唯一后端只是存储和数据同步。 Realm似乎提供了我想要的东西。
到目前为止,我有一个领域的实例。我开始遇到的问题是访问控制。我觉得我可能对Realm可以为我提供的东西有一个根本的误解,并且那里没有大量奇妙的资源。 Realm文档非常详细,但它没有最好的工作示例。
我的应用程序将用于跟踪可用的一组玩家的团队。这组球员将是相对稳定和不变的。然而,团队将经常变化。考虑到这一点,我对我的Realm设置有了以下想法:
/Players
。每个用户都应具有对此领域的读取权限,但只有管理员才能进行编写和管理。/~/MyRoster
的每个用户的单个领域。该领域应该由该用户读/写。我认为用户应该能够授予另一个用户对其领域的临时读/写访问权。这听起来像是Realm后端的可接受使用吗?我该如何管理中央共享数据池?我应该在注册后立即为用户创建/~/MyRoster
域吗?我怎样才能按照我想要的方式配置权限?对我来说,权限结构似乎很奇怪。似乎我可以使用PermissionOffer/PremissionOfferResponse
构造来实现我想要的Realm共享。
非常感谢任何帮助。
答案 0 :(得分:7)
感谢您的详细报道。你提出的架构似乎很合适。以下是我的建议:
/Players
领域,我会在开发中创建它。今天这有点笨拙,因为您必须使用客户端SDK以管理员用户身份打开Realm(因为只有管理员用户可以在其范围/~/
目录之外创建Realms)。您可以在应用中创建一个代码路径,如果您以管理员身份登录,则会打开/Players
域,然后对该域应用权限更改: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的情况下调整权限。
对于特定于用户的领域,您不需要立即创建它们,因为当用户最终需要时,将会延迟创建领域。我的意思是Realm的设置使你可以在客户端上同步打开一个Realm(启用离线优先功能),然后在客户端同步到服务器的第一次创建之后,服务器是否真正意识到了在其中创建领域。因此,您需要设置客户端代码,以便在必要时在/~/MyRoster
打开领域。
对于向其他用户授予权限,这将使用Swift access control APIs将权限更改应用于用户的Realm并授予对其他用户的访问权限。这可以动态发生,以便用户可以根据需要授予,然后撤销权限。
关于组的第三部分,我将创建另一个全局领域/Group
,它对拥有组表示的所有用户具有读/写访问权限。例如,您可以拥有一个Group
对象,其中包含一个链接到User
个对象的列表属性,在您的应用程序中每个用户有1 User
个。这样每个用户都可以对Realm进行更改,以表示他/她所属的组。
您可以设置领域功能来监听对/Group
领域的更改,以便在将用户添加到组或删除时,该功能将触发对组中各个领域的必要权限更改。
现在,如果您担心/Group
领域的访问控制,您可以设置一个领域功能,该功能使用管理员用户将更改应用于/Groups
,并监听用户特定的领域/~/MyRequests
用户可以在此Realm中写入一个对象,该对象将触发该功能对组Realm进行更改。通过这种方式,您可以防止未经授权的请求,并将/Group
域作为只读管理员的所有用户。