Firebase 如何限制用户从Firestore文档中读取数据?
我的数据库结构如下所示:Firebase 如何限制用户从Firestore文档中读取数据?,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我的数据库结构如下所示: Firestore-root | --- users (collection) | | | --- UidOne (document) | | | --- userName: "UserOne" | --- items (collection) | --- ItemIdOne (document) | |
Firestore-root
|
--- users (collection)
| |
| --- UidOne (document)
| |
| --- userName: "UserOne"
|
--- items (collection)
|
--- ItemIdOne (document)
| |
| --- itemName: "ItemOne"
|
--- ItemIdTwo
|
--- itemName: "ItemTwo"
我想要实现的是使用安全规则限制每个用户从items
集合中的每个文档中读取项目名称。我就是这样做的:
service cloud.firestore {
match /databases/{database}/documents {
match /items/{item} {
allow read, write: if false;
}
}
}
要显示项目名称,我使用以下查询:
Query query = itemsRef.orderBy("itemName", Query.Direction.ASCENDING);
当我尝试编译我的应用程序时,出现以下错误:
com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions.
但项目名称仍显示在my
RecyclerView
中。如何阻止这种情况发生?可能需要检查您的项目是否仍然来自本地缓存
从第页将此添加到您的OneEvent
String source = querySnapshot.getMetadata().isFromCache() ?
"local cache" : "server";
Log.d(TAG, "Data fetched from " + source);
如果它正在从本地缓存读取,您可以这样设置PersistenceEnabled(false)(该页也提到):
即使您处于联机状态,它也将从本地快照读取数据,并且仅在数据更改时更新快照。是你的规则改变了你的数据。我发现当测试设置为true时,我得到了一些意想不到的结果。我发现在测试和更改代码/规则时,我更喜欢将其设置为false。谢谢您的回答,但我始终在线。即使在线,它仍将从本地快照读取。很抱歉,我在火车上写这个答案时,我已经添加了代码和链接到Firestore页面。我希望这有帮助,你的规则在我看来很好,你得到了预期的许可被拒绝。
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
.setPersistenceEnabled(false)
.build();
db.setFirestoreSettings(settings);