Realm Flexible Sync关联集合无ownerId时的权限配置问题求助
解决方案:Realm Flexible Sync 嵌套/关联对象权限配置
针对你的问题,有两种可行方案,可根据业务需求选择:
方案一:将Page和Paragraph改为嵌入式对象(EmbeddedObject)
既然Page和Paragraph仅通过父级访问、不会单独查询,最简洁的方式是把它们改为EmbeddedObject。这类对象会作为Book文档的一部分存储,而非独立集合,权限完全继承自父级Book,无需额外配置或添加ownerId字段。
修改后的模型代码:
class Book: Object, ObjectKeyIdentifiable { @Persisted(primaryKey: true) var _id: UUID @Persisted var name: String @Persisted var pages = List<Page>() @Persisted var ownerId = "" } // 改为嵌入式对象,不再是独立的Object class Page: EmbeddedObject, ObjectKeyIdentifiable { @Persisted var _id: UUID // 可保留唯一标识,无需主键 @Persisted var label: String @Persisted var paragraphs = List<Paragraph>() } // 改为嵌入式对象 class Paragraph: EmbeddedObject, ObjectKeyIdentifiable { @Persisted var _id: UUID @Persisted var text: String }
权限规则配置:
仅需对Book集合设置权限:
- 读权限:
{ "ownerId": "%%user.id" } - 写权限:
{ "ownerId": "%%user.id" }
此时用户访问自己的Book文档时,自动能访问其下的pages和paragraphs,无需单独订阅或配置子对象的权限规则。
方案二:保留独立对象,通过反向关联实现权限继承
如果需要保留Page和Paragraph为独立集合(比如后续可能单独查询),可以通过反向关联在权限规则中链式验证父级Book的ownerId,无需在子对象中添加ownerId字段。
修改后的模型代码:
class Book: Object, ObjectKeyIdentifiable { @Persisted(primaryKey: true) var _id: UUID @Persisted var name: String @Persisted var pages = List<Page>() @Persisted var ownerId = "" } class Page: Object, ObjectKeyIdentifiable { @Persisted(primaryKey: true) var _id: UUID @Persisted var label: String @Persisted var paragraphs = List<Paragraph>() // 添加反向关联到Book @Persisted(originProperty: "pages") var book: LinkingObjects<Book> } class Paragraph: Object, ObjectKeyIdentifiable { @Persisted(primaryKey: true) var _id: UUID @Persisted var text: String // 添加反向关联到Page @Persisted(originProperty: "paragraphs") var page: LinkingObjects<Page> }
权限规则配置:
- 对
Page集合设置权限:
读/写权限:{ "book.ownerId": "%%user.id" } - 对
Paragraph集合设置权限:
读/写权限:{ "page.book.ownerId": "%%user.id" }
订阅注意事项:
订阅Page或Paragraph集合时,查询条件需与权限规则匹配,例如:
// 订阅当前用户有权限的Page let pageSubscription = QuerySubscription<Page> { $0.book.ownerId == app.currentUser!.id }
内容的提问来源于stack exchange,提问作者andreas.teich
相关产品推荐
相关产品推荐

