Firestore 安全规则缺少为新的经过身份验证的用户创建新文档的权限

Firestore security rules missing permissions on create new document for new authenticated user

我正在尝试设置基于角色的 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);
}

我设置控制器的方式是创建一个新文档,新用户的文档 ID 为 request.auth.uid

我想要规则来识别新用户是否经过身份验证,并且创建个人资料信息的传入请求必须具有与授权用户 ID 匹配的有效用户 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}

request.resource.data 是您要添加到文档中的数据。当前 uid 不是文档中的字段,而是 personalInfo 映射中的 属性。因此,您必须指定要在安全规则中读取的字段的路径。以下应该有效:

function incomingUidEqualsAuthId(){
    return request.resource.data.personalInfo.uid == request.auth.uid;
}