如何在MongoDB Realm中配置权限允许编辑指定集合的部分字段
问题核心原因
- 普通集合级别的权限规则和Atlas Device Sync(原Realm Sync)是两套完全独立的权限体系,你之前配置的集合fields字段权限仅对普通SDK CRUD、Data API请求生效,完全不会作用于Sync同步请求
- Sync权限存在两层校验逻辑,优先级为:Sync全局读写权限 > Sync专属角色/细粒度权限。你之前将Sync全局write设为false,会话在BIND绑定阶段就会被直接拒绝,对应你遇到的206错误,根本不会走到后续细粒度规则校验环节
- 你开启Sync全局write后出现全字段可写的问题,大概率是你开启了Sync的开发模式(Development Mode),该模式下会默认绕过所有自定义细粒度权限,允许所有读写操作
正确配置步骤
- 关闭Sync的开发模式,确保自定义权限可以生效
- 将Sync全局读写权限均设置为
true,保证同步会话可以正常建立 - 进入Sync配置页的「Roles & Permissions」模块,配置专属的Sync角色规则,替代原来的普通集合规则,示例规则如下:
{ "roles": [ { "name": "default", "apply_when": { "%%true": true }, "read": true, "insert": false, "delete": false, "write": { "$or": [ // 仅允许修改countViews { "$arrayEq": [{ "$objectToArray": "%%diff" }, ["countViews"]] }, // 仅允许修改listViewers { "$arrayEq": [{ "$objectToArray": "%%diff" }, ["listViewers"]] }, // 允许同时修改countViews和listViewers { "$arrayEq": [{ "$objectToArray": "%%diff" }, ["countViews", "listViewers"]] } ] } } ] }
规则中
%%diff是Sync权限内置变量,指代本次同步请求变更的所有字段集合,上述规则仅允许变更的字段为指定的两个字段,修改其他字段的请求都会被直接拒绝
校验方式
配置完成后重新发起同步请求,修改countViews/listViewers字段可以正常同步,修改其他字段会触发权限拒绝,符合预期。
内容的提问来源于stack exchange,提问作者Aleksandr Prokopenko
相关产品推荐
相关产品推荐

