能否通过IAM限制Firestore原生模式中服务账号仅访问自身创建的文档?
一、服务账号仅读写自身创建文档的实现方案
完全可以实现,需要结合IAM基础权限和Firestore安全规则完成,具体操作步骤如下:
配置IAM基础权限
给目标服务账号分配roles/datastore.user角色(或精细化权限组合:datastore.entities.create、datastore.entities.get、datastore.entities.list),确保它具备Firestore的基础读写能力,后续通过安全规则缩小访问范围。写入文档时强制存储创建者标识
在GCE实例向Firestore写入元数据时,必须在文档中添加createdBy字段,值为该服务账号的邮箱地址(可通过GCE元数据服务获取:curl http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/email -H "Metadata-Flavor: Google")。配置Firestore安全规则
通过规则限制仅文档的创建者能读取、更新或删除该文档,同时强制写入时必须携带自身账号标识:rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { // 允许服务账号写入,但必须携带自身邮箱作为创建者 allow create: if request.auth != null && request.resource.data.createdBy == request.auth.token.email; // 仅允许创建者读取文档 allow read: if request.auth != null && resource.data.createdBy == request.auth.token.email; // 仅允许创建者更新/删除自己的文档(按需启用) allow update, delete: if request.auth != null && resource.data.createdBy == request.auth.token.email; } } }配置完成后,服务账号仅能读取自身写入的文档,无法访问其他数据。
二、Firestore原生模式下的批量读取支持
Firestore原生模式完全支持批量读取实体操作,对应的IAM权限要求翻译如下:
datastore.entities.get:用于获取单个实体,批量读取中每个实体的获取都会用到该权限datastore.entities.list:用于执行实体集合的查询操作,当通过查询语句批量获取符合条件的文档时需要该权限
实际使用中,不管是调用getAll()方法批量获取指定ID的文档,还是通过查询语句筛选批量数据,只要服务账号拥有上述权限,并且通过安全规则的校验(比如仅能读取自身创建的文档),就可以正常执行批量读取操作。
内容的提问来源于stack exchange,提问作者user20244646

