我試圖創建一個規則,只允許用戶創建/編輯在request.auth.uid
他們試圖創建文檔的名稱相匹配的文件。從https://cloud.google.com/firestore/docs/security/secure-data:公司的FireStore規則時數據不存在
使用通配符從
變量當你使用一個通配符數據庫路徑匹配規則, 變量與你匹配包括 花括號內的字符串命名的。然後,您可以在您的安全規則中引用這些變量 。
這些類型的通配符的一種常見用途是通過 userID存儲文檔,然後僅允許用戶訪問其文件的ID爲 的用戶ID。
service cloud.firestore { match /databases/{database}/documents { match /users/{userIDFromWildcard}/ { // Users can only edit documents in the database if the documentID is // equal to their userID allow read, write: if request.auth.uid == userIDFromWildcard; } } }
我想在我的規則使用此代碼,但它的錯誤。當去掉最後/
,即match /users/{userIDFromWildcard}
而不是match /users/{userIDFromWildcard}/
,它出版,但如果該文件不存在,未授予權限。
編輯:我也嘗試過這樣的事情,但我不知道該怎麼做是正確的,因爲缺少文檔:
allow read, write: if request.auth.uid == request.resource.__name__;
這是我運行得到insufficient permissions
的代碼:
this.items = afs.doc("https://stackoverflow.com/users/" + this.uid); // afs is AngularFirestore, this.uid is the uid of the authenticated user
...
// the user is authenticated at this point
this.items.snapshotChanges().subscribe(snapshot => {
if (!snapshot.payload.exists) { // if user isn't in db
function recursive() {
// ...
this.updateDB(); // called once because of conditional
}
recursive();
} else {
// ...
}
}
updateDB
:
public updateDatabase(): void {
const changes: Item = { name: this.name, username: this.username,
photoURL: this.photoURL };
this.items.set(changes).then((item) => { // causes error
console.log("Saving successful");
}, (err) => {
console.log(err);
}).catch((err) => {
console.log(err);
});
}
你能告訴你正在運行的代碼產生錯誤,什麼錯誤樣子? –
@hatboysam沒有錯誤,它只是不工作。不幸的是,firestore規則沒有模擬器或體面的調試工具。該代碼是在問題,在報價的代碼直接拷貝/粘貼,只是沒有最後的斜線 – Cilan
那些只是你的規則,對實際調用的代碼是什麼'設置()'或'更新()'寫數據?這就是應該產生一些錯誤的代碼。 –