0

我試圖創建一個規則,只允許用戶創建/編輯在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); 
    }); 
} 
+0

你能告訴你正在運行的代碼產生錯誤,什麼錯誤樣子? –

+0

@hatboysam沒有錯誤,它只是不工作。不幸的是,firestore規則沒有模擬器或體面的調試工具。該代碼是在問題,在報價的代碼直接拷貝/粘貼,只是沒有最後的斜線 – Cilan

+0

那些只是你的規則,對實際調用的代碼是什麼'設置()'或'更新()'寫數據?這就是應該產生一些錯誤的代碼。 –

回答

0

你可能需要這個設置爲文件:

service cloud.firestore { 
    match /database/{databases}/documents { 
    match /users/{userId}/{document=**} { 
     allow read, write: if request.auth.uid == userId; 
    } 
    } 
} 

另外,如果你需要寫一個子集看到this answer

而且在公司的FireStore here

上通配符匹配的更多信息