Я использую следующие правила FireBase:
service cloud.firestore {
match /databases/{database}/documents {
match /classes/{document=**} {
allow read, write: if isSignedIn();
}
match /users/{userId}/{document=**} {
allow read, write: if isSignedIn() && request.auth.uid == userId || isSignedIn() && hasPermission();
}
}
function isSignedIn() {
return request.auth.uid != null;
}
function hasPermission() {
return request.auth.uid in resource.data.ruleList;
}
}
rulesList
contains
my user_uuid. Если пользователь хочет управлять своими собственными документами, это работает. Там будет, например, пэт: /users/32T9lJ5nSEZrhLgxul4goBcscqk2/...data
. Но администраторы должны читать данные других пользователей. И именно это не работает. Когда ruleList
содержит user_uuid, он должен иметь возможность читать все данные каждого пользователя. Что я делаю не так?
Следующий код получает пользователя user_uuids из коллекции, называемой «классы», и выполняет поиск по имени каждого пользователя:
db.collection("classes").doc(klasse).get().then(function(doc) {
if (doc.exists) {
const data = doc.data();
const members = data.members;
members.reduce((chain, el) => {
return chain
.then(() => db.collection("users").doc(el).collection("user_data").doc("u").get())
.then(doc => {
const data = doc.data();
var member_name = data.name;
})
}, Promise.resolve()).then(console.log("finished"));
} else {
console.log("No such document!");
}
}).catch(function(error) {
console.log("Error getting document:", error);
});
Возвращает предупреждение, вызванное недостаточным разрешением.
~ филип