Firestore Security Rules配置:用户仅访问自身资源权限问题及解决
Firestore读取权限拒绝问题解决:必须添加用户ID过滤查询
我是Firebase新手,正在开发一个多用户待办清单App来熟悉Firestore和Security Rules。创建了两个Firebase Auth账号,待办文档包含userID字段用于标识所属用户(与Auth用户UID匹配)。
我配置了Security Rules,通过对比request.auth.uid与todo.userID实现用户仅查看自身待办事项,write规则可正常工作(不同UID请求会被拒绝),但读取文档时一直出现permission-denied错误。尝试多种方法及查阅文档后仍未解决,最终通过在代码中添加where条件查询(过滤userID等于当前用户uid)解决问题。
解决前代码
const collectionRef = collection(db, "todos"); export function subscribeToDatebase(setTodos, setErr, uid) { function snapshot(snapshot) { const todosCollection = snapshot.docs; const todos = []; todosCollection.forEach((t, i) => todos.push({ firebaseID: t.id, ...t.data(), timeStamp: t.data().timeStamp, }) ); setTodos(todos); } function error(err) { setErr(err.code); } const unSub = onSnapshot(collectionRef, snapshot, error); return unSub; }
解决后代码
const collectionRef = collection(db, "todos"); export function subscribeToDatebase(setTodos, setErr, uid) { function snapshot(snapshot) { const todosCollection = snapshot.docs; const todos = []; todosCollection.forEach((t, i) => todos.push({ firebaseID: t.id, ...t.data(), timeStamp: t.data().timeStamp, }) ); setTodos(todos); } function error(err) { setErr(err.code); } // 新增的关键代码 const q = query(collectionRef, where("userID", "==", uid)); // 将监听对象换成带过滤条件的查询 const unSub = onSnapshot(q, snapshot, error); return unSub; }
问题原因
Firestore的安全规则遵循规则不是过滤器的核心原则:你不能先发起全集合读取请求,再依赖安全规则过滤掉无权限的文档。规则会验证你的查询是否只能返回符合权限要求的文档,如果查询没有明确限定userID等于当前用户UID,Firestore无法确保返回的所有文档都满足权限条件,因此会直接拒绝读取请求。只有在查询中添加与规则逻辑匹配的过滤条件,规则才能确认该查询的结果全是用户有权访问的内容,从而允许读取操作。
内容的提问来源于stack exchange,提问作者Dula
相关产品推荐
相关产品推荐

