You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:33:14