我正在嘗試設定基于角色的 Firestore 安全規則,但如果傳入的資料 uid 與 auth uid 匹配,我會遇到如何創建新檔案的問題。
但是在哪里定義傳入的 uid?
我試圖將新用戶的用戶 uid 初始化為我的模型,如下面的代碼,但它仍然缺少一些權限。
final personalInfoData = PersonalInfoModel(
uid: auth.getUid(),
name: name,
age: int.parse(age),
);
這是我的代碼看起來像
match /profile/{profileId}/{document=**}{
allow read: if isSignedIn() && docIdEqualsAuthId(profileId);
allow create: if isSignedIn() && incomingUidEqualsAuthId();
}
function isSignedIn(){
return request.auth != null;
}
function docIdEqualsAuthId(profileId){
return profileId == request.auth.uid;
}
function incomingUidEqualsAuthId(){
return request.resource.data.uid == request.auth.uid;
}
這是我的控制器代碼:
String getUid() {
return auth.currentUser!.uid;
}
final personalInfoData = PersonalInfoModel(
name: name,
age: int.parse(age),
);
DocumentReference profileCRef =
firestore.collection("profile").doc(auth.getUid());
try {
await profileCRef.set({'personalInfo': json}, SetOptions(merge: true));
} on Exception catch (e) {
print(e);
}
我設定控制器的方式是它將創建一個新檔案,其中包含request.auth.uid新用戶的檔案 ID。
我希望規則確定新用戶是否已通過身份驗證,并且創建組態檔資訊的傳入請求必須具有與身份驗證 uid 匹配的有效用戶 ID。
如果該檔案在資料庫中仍然不存在,則創建一個 ID 為 uid 的新檔案。
我得到的錯誤是這個
W/Firestore(14626): (24.0.1) [WriteStream]: (221034) Stream closed with status: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}.
W/Firestore(14626): (24.0.1) [Firestore]: Write failed at profile/N8CuobvPdHXr40KYgebw52SmOBp2: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
uj5u.com熱心網友回復:
這request.resource.data是您嘗試在檔案中添加的資料。當前uid不是檔案中的欄位,而是personalInfo地圖中的屬性。因此,您必須指定您嘗試在安全規則中讀取的欄位的路徑。以下應該有效:
function incomingUidEqualsAuthId(){
return request.resource.data.personalInfo.uid == request.auth.uid;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/432515.html
標籤:火力基地 扑 谷歌云火库 firebase-安全
