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