Firebase Firestore PERMISSION_DENIED 错误修复指南:恢复对数据访问权
2024-03-08 15:55:07
修复 Firebase Firestore PERMISSION_DENIED 错误的终极指南
简介
在使用 Firebase Firestore 读写数据时,您可能会遇到烦人的 PERMISSION_DENIED 错误。本指南将深入探讨导致此错误的原因,并提供全面的解决方案,帮助您恢复对 Firestore 数据的访问权限。
错误的原因
PERMISSION_DENIED 错误表明您没有足够的权限来访问请求的文档或集合。这通常是由于以下原因之一:
- 安全规则未正确配置: Firestore 安全规则决定了用户可以访问哪些数据。
- 用户未经身份验证: 匿名用户或未登录的用户没有权限访问受保护的数据。
- 规则匹配不正确: 安全规则应与要访问的文档或集合的路径相匹配。
解决方法
1. 检查安全规则
- 前往 Firebase 控制台,点击“Firestore”选项卡。
- 转到“规则”部分,并检查安全规则是否允许用户访问您要查询的集合和文档。
2. 授权用户
- 对于匿名用户,请调用
Firebase.auth().signInAnonymously()
。 - 对于已登录用户,请调用
Firebase.auth().signInWithCredential()
。
3. 设置读写规则
在安全规则中添加以下规则,允许所有经过身份验证的用户读写数据:
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth.uid == userId;
}
}
4. 检查规则匹配
确保安全规则与要访问的文档或集合的路径匹配。例如,如果要访问 /users/alice/messages
,安全规则应如下所示:
match /databases/{database}/documents {
match /users/alice/messages {
allow read, write: if request.auth.uid == userId;
}
}
5. 重新加载规则
更新安全规则后,请重新加载它们以确保它们已应用。
代码示例
db.collection("users")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
System.out.println(document.getId() + " => " + document.getData());
}
} else {
if (task.getException() instanceof FirebaseAuthException) {
// 用户未登录或身份验证凭据无效
} else if (task.getException() instanceof FirestoreException) {
// 权限不足或安全规则禁止访问
} else {
// 其他错误
}
}
}
});
结论
通过遵循本指南中概述的步骤,您可以解决 Firebase Firestore PERMISSION_DENIED 错误并恢复对所需数据的访问权限。请记住,安全规则是确保数据安全性的关键,因此在更新它们时要小心谨慎。
常见问题解答
1. 如何检查用户是否已经登录?
使用 Firebase.auth().getCurrentUser()
来检查当前登录的用户。
2. 为什么我的安全规则无效?
确保规则正确格式化,并且与要访问的文档或集合的路径匹配。
3. 如何更改匿名用户的权限?
调用 Firebase.auth().signInAnonymously()
后,使用 Firebase.auth().currentUser.getIdToken(true)
来获取用户令牌。
4. 如何在代码中处理权限错误?
使用 try-catch 块来捕获 FirestoreException
,并根据错误类型相应地处理。
5. 如何授予管理员所有权限?
在安全规则中添加以下规则:
allow read, write: if request.auth.uid == "admin-uid";