#firebase #google-cloud-firestore #firebase-security
#firebase #google-облако-firestore #firebase-безопасность
Вопрос:
У меня есть коллекция пользователей:
users:
userUid:
group: "group_1"
name: "Paul"
userUid:
group: "group_1"
name: "Gregor"
userUid:
group: "group_2"
name: "Mary"
и коллекция списков покупок:
shoppingList:
listUid:
isActive: true,
group: "group_1",
name: "list_ONE"
listUid:
isActive: false,
group: "group_1",
name: "list_TWO"
listUid:
isActive: true,
group: "group_2",
name: "list_THREE"
Я хотел бы ограничить доступ к чтению / обновлению, чтобы только люди, принадлежащие к определенной группе, могли редактировать / читать документы в пределах одной группы.
Я попытался использовать следующее правило, просматривая документы, но в симуляторе консоли Firabase я получаю «неизвестную ошибку», и я не получаю никаких консольных подсказок об этом:
service cloud.firestore {
match /databases/{database}/documents {
function signedIn() {
return request.auth.uid != null;
}
function getGroup(usr) {
return usr.data.group;
}
function isInGroup(usr, groupName) {
return signedIn() amp;amp; (getGroup(usr) == groupName);
}
match /users/{user} {
// Read access needed to get the user group
allow read: if signedIn();
}
match /shoppingLists/{shoppingList} {
// Everybody can create a new list
allow create: if signedIn();
// Only people from the list group can read/update that list
allow read: if isInGroup(get(/databases/$(database)/documents/users/$(request.auth.uid)), resource.data.group);
allow update: if isInGroup(get(/databases/$(database)/documents/users/$(request.auth.uid)), request.resource.data.group)
amp;amp; request.resource.data.isActive;
}
}
}
Комментарии:
1. К вашему сведению, если вы хотите отформатировать код в вопросе, вы можете выбрать весь код и использовать кнопку {} в редакторе для форматирования всего.
Ответ №1:
Вы неправильно используете get() в своих правилах. Вы передаете строковый путь к документу, который включает коллекции и документы, но get() требует, чтобы вы передали объект path, который 1) не является строкой, и 2) имеет префикс with /databases/$(database)/documents
. Вам следует прочитать документацию по доступу к другим документам, чтобы увидеть некоторые примеры, такие как этот:
service cloud.firestore {
match /databases/{database}/documents {
match /cities/{city} {
// Make sure a 'users' document exists for the requesting user before
// allowing any writes to the 'cities' collection
allow create: if exists(/databases/$(database)/documents/users/$(request.auth.uid))
// Allow the user to delete cities if their user document has the
// 'admin' field set to 'true'
allow delete: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true
}
}
}