gpt4 book ai didi

javascript - Angular 色和用户的 Firestore 规则

转载 作者:行者123 更新时间:2023-11-30 20:31:07 25 4
gpt4 key购买 nike

我正在尝试在我的 firestore 数据库中构建类似基于 Angular 色的访问 ( https://firebase.google.com/docs/firestore/solutions/role-based-access )。但是我定义的 Angular 色不起作用。我总是遇到错误

Missing or insufficient permissions.

到目前为止,我的 firestore 规则中有以下内容:

service cloud.firestore {
match /databases/{database}/documents {

function isSignedIn() {
return request.auth != null;
}

function getRole(rsc) {
return rsc.data.roles[request.auth.uid];
}

function isOneOfRoles(rsc, array) {
return isSignedIn() && (getRole(rsc) in array) || isSignedIn() && rsc.data.openWorld == true;
}

match /users/{user} {
allow read: if isSignedIn() && request.auth.uid == resource.data.uid;
}

// Match any document in the 'worlds' collection
match /worlds/{world} {
allow read: if isOneOfRoles(resource, ['owner', 'writer', 'commenter', 'reader']);
}
}
}

我的文档结构如下:ROOT/worlds/{WORLDID}/...以及其中的每个文档如下所示:

{
name: "Open World",
desc: "",
openWorld: true,
roles: {
DzpqsN6QjmZoCoM0eymWJ17VKbG3: "owner"
}
}

我将其与 Angular Frontedn 和 Angularfire 一起使用,并将以下代码包装到服务中:

getWorlds(userId): Observable<any> {
return this.afs.collection('worlds').snapshotChanges().map(actions => {
return actions.map(a => {
const data = a.payload.doc.data();
const id = a.payload.doc.id;
return { id, ...data };
});
}).catch((e: any) => Observable.throw(this.errorHandler(e)));
}

有人能看出哪里可能有错误吗,或者此时 firestore 是否存在一般错误?谢谢!

最佳答案

编辑您的评论:

您的查询失败“因为它不包含与您的安全规则相同的约束”。参见 https://firebase.google.com/docs/firestore/security/rules-query#secure_and_query_documents_based_on_authuid .

换句话说,您不能仅依靠安全规则来过滤用户可以阅读的文档,您必须相应地构建查询。但是,这对于您当前的数据结构是不可能的,因为 Firestore 不支持逻辑 OR 查询(例如,以下不可能是 owner OR writer、owner OR openWorld 等)。


我已经彻底测试了你的规则,它们似乎在所有情况下都能正常工作,即对于不同的 Angular 色,在 openWorld = true 的情况下,并且没有声明正确的 Angular 色,在这种情况下openWorld = false 等。您确定您的用户已正确登录吗?您是否等待足够的时间让规则“传播”?

这是用于测试的JavaScript代码

var docRef = firestoredb.collection("worlds").doc("x9fwf0Wi528OBlGYIZz1");

firebase.auth().signInWithEmailAndPassword("xxxx@xxx.com", "xxxxx")
.then(function(userCredential) {

docRef.get().then(function(doc) {
if (doc.exists) {
console.log("Document data:", doc.data());

} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}

}).catch(function(error) {
console.log("Error getting document:", error);
});

});

最后,这里有一个建议:我可能会重构您的规则,将 isOneOfRolesisOpenWorld 分开,例如:

    function isOneOfRoles(rsc, array) {
return isSignedIn() && (getRole(rsc) in array);
}

function isOpenWorld(rsc) {
return isSignedIn() && rsc.data.openWorld == true;
}

.....

// Match any document in the 'worlds' collection
match /worlds/{world} {
allow read: if isOneOfRoles(resource, ['owner', 'writer', 'commenter', 'reader']) || isOpenWorld(resource);
}

关于javascript - Angular 色和用户的 Firestore 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50324397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com