问题描述
我设置了这样的 Firestore 安全规则。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read: if request.auth != null;
}
match /users/{userId}/{document=**} {
allow read,create,update,delete: if request.auth != null && request.auth.uid == userId ;
}
}
}
我应该如何设置规则-
解决方法
您的规则中有一个 overlapping match statement,因为您使用 match /{document=**}
映射到数据库中的ALL 文档(请参阅 doc)。>
所以,因为:
- 在多个允许表达式匹配一个请求的情况下,如果任何一个条件为真,则允许访问,并且
- 对于
match /{document=**}
语句,您的规则是allow read: if request.auth != null;
,则
每个经过身份验证的用户都可以读取任何 user
文档(您不会像对 uid
集合那样限制 users
。实际上您不能这样做,因为 {{ 1}} 没有专门针对 match /{document=**}
集合)。
最好是去掉这个块,只保留下面的块。
users
如果您需要授予对其他集合的读取权限,请为每个集合使用规则,而不是使用通配符方法。
PS:您可以仔细检查是否确实需要执行 match /users/{userId}/{document=**} {
allow read,create,update,delete: if request.auth != null && request.auth.uid == userId ;
}
,这将授予对 match /users/{userId}/{document=**}
文档的所有子集合的访问权限。您可能只需要执行 users
。