我正在構建一個應用程式并將 firestore 規則設定為僅允許用戶 CRUD 訪問他們在一個簡單的單層資料庫中的資料。
Firestore 規則
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /todos/{userId} {
allow create, read, update, delete: if request.auth != null && request.auth.uid == userId;
}
}
}
如果我只使用 if 陳述句 if request.auth != null,用戶就可以看到資料庫中的所有資料。
當我添加時,&& request.auth.uid == userId我收到控制臺錯誤,“react_devtools_backend.js:4061 快照偵聽器中未捕獲的錯誤:FirebaseError:缺少或權限不足。” 用戶看不到任何資料,包括他們自己的資料。
我已經閱讀了檔案,但遺漏了一些東西——我認為是在我的查詢、快照中,還是兩者兼而有之?
這是我的代碼:
初始化火力基地(firebase.js)
// init Firebase
export const app = initializeApp(firebaseConfig);
//init services
export const db = getFirestore(app);
export const auth = getAuth();
然后是我的查詢和快照(app.js)
import React, { useState, useEffect } from "react";
import Button from "react-bootstrap/Button";
import Form from "react-bootstrap/Form";
import InputGroup from "react-bootstrap/InputGroup";
import "./App.css";
import Todo from "./components/Todo";
import { db } from "./firebase";
import {
collection,
query,
orderBy,
onSnapshot,
addDoc,
serverTimestamp,
} from "firebase/firestore";
//collection ref, order by functionality
const q = query(
collection(db, "todos"),
orderBy("timestamp", "desc")
);
//firebase functionality
function App({ user }) {
const [todos, setTodos] = useState([]);
const [input, setInput] = useState("");
useEffect(() => {
onSnapshot(q, (snapshot) => {
setTodos(
snapshot.docs.map((doc) => ({
id: doc.id,
item: doc.data(),
}))
);
});
}, [input]);
const addTodo = (e) => {
e.preventDefault();
addDoc(collection(db, "todos"), {
todo: input,
timestamp: serverTimestamp(),
userId: user.uid,
});
setInput("");
};
我將不勝感激任何指導/提示。我已經為此作業了幾天。謝謝!
uj5u.com熱心網友回復:
您的安全規則允許用戶在 path 中僅讀取一個檔案/todos/$uid。但是,您的代碼會嘗試讀取todos規則不允許的整個集合。這解釋了你得到的錯誤。
請記住,規則不是過濾器,而只是強制您不要嘗試讀取(或寫入)超過允許的資料。如果你想讀取當前用戶的檔案,你應該等到當前用戶被加載(使用auth state listener),然后只加載那個用戶的檔案。
uj5u.com熱心網友回復:
在弗蘭克的指導下,我找到了解決辦法。謝謝弗蘭克!
這些是我更新的規則
rules_version = '2';
service cloud.firestore {
match /{todos=**} {
allow read, update, delete: if request.auth != null && resource.data.userId == request.auth.uid;
allow create: if request.auth !=null;
}
}
我更新的查詢和快照
import React, { useState, useEffect } from "react";
import Button from "react-bootstrap/Button";
import Form from "react-bootstrap/Form";
import InputGroup from "react-bootstrap/InputGroup";
import "./App.css";
import Todo from "./components/Todo";
import {
collection,
query,
orderBy,
onSnapshot,
addDoc,
serverTimestamp,
where,
} from "firebase/firestore";
import { db } from "./firebase";
//firebase functionality
function App({ user }) {
const [todos, setTodos] = useState([]);
const [input, setInput] = useState("");
const [lastChange, setLastChange] = useState("");
//executing the query
useEffect(() => {
//console.log(user);
if (user == null) return;
var q = query(
collection(db, "todos"),
orderBy("timestamp", "desc"),
where("userId", "==", user.uid)
);
onSnapshot(q, (snapshot) => {
setTodos(
snapshot.docs.map((doc) => ({
id: doc.id,
item: doc.data(),
}))
);
});
}, [lastChange, user]);
//add a new task
const addTodo = (e) => {
e.preventDefault();
addDoc(collection(db, "todos"), {
todo: input,
timestamp: serverTimestamp(),
userId: user.uid,
});
setInput("");
setLastChange(serverTimestamp());
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/442306.html
標籤:javascript 反应 火力基地 谷歌云火库
上一篇:如何檢查FirebaseStripe擴展是否已完成創建客戶/用戶檔案?
下一篇:嘗試在androidstudiofirebasemainactivity中的空物件參考上呼叫虛擬方法booleanjava.lang.String.equals(java.lang.Object)
