Firebase安全规则:allow get是否阻止未认证用户读取文档数据?
Firestore规则疑问解答
首先明确你的核心误解:allow get: if request.auth == null; 这条规则会完全允许未认证用户读取对应文档的所有字段数据,绝非只能看到文档ID。Firestore的get操作本身就是获取完整文档内容的请求,只要规则放行,请求者就能拿到文档里存储的全部字段。
然后说你两条规则的冲突:
Firestore的read权限是包含get(单文档读取)和list(集合查询)的复合权限。当未认证用户发起get请求时,第一条规则的条件满足会允许请求;第二条规则的read条件不满足,但Firestore规则的逻辑是「只要有一条匹配的allow规则符合条件,就允许请求」,所以未认证用户的get请求会被通过,进而获取到文档的所有字段数据,这和你不想泄露字段的需求完全相悖。
针对你的需求(未认证用户仅判断用户名是否被占用,已认证用户读取完整文档),正确的实现方式是:
因为Firestore规则无法限制请求返回的字段(要么全放行,要么全拒绝),所以不能直接在用户集合上给未认证用户get权限。你需要:
- 新建一个辅助集合(比如叫
username-checks),专门用来存用户名的占用状态:文档ID设为要检查的用户名,文档里只存一个无敏感信息的字段(比如exists: true) - 给这个辅助集合设置规则:
match /username-checks/{username} { // 允许未认证用户读取,判断用户名是否存在 allow get: if request.auth == null; // 仅允许可信身份写入(比如管理员或注册流程的服务端),防止恶意占用用户名 allow write: if request.auth != null && request.auth.token.admin == true; } - 主用户集合的规则保持你的需求:
match /users/{userId} { allow read: if request.auth != null; // 可根据实际需求添加写入、更新等规则 }
这样未认证用户通过请求辅助集合的文档,就能判断用户名是否被占用,且接触不到任何敏感字段;已认证用户则正常读取主用户集合的完整文档。
内容的提问来源于stack exchange,提问作者KatM
相关产品推荐
相关产品推荐

