Мне интересно, безопасно ли хранить конфиденциальные пользовательские данные в коллекциях документов (см. Структуру ниже) и использовать Firestore.rules (см. Правила ниже), чтобы запретить определенным c пользователям доступ к коллекции внутри документа? Если я выполню инструкцию get
в пользовательском документе, будет ли доступна частная коллекция? Или он доступен только в том случае, если я вызову инструкцию get для документа address
(например)?
Извините, если это где-то в Интернете, но я не смог найти окончательный ответ, и это несколько важно для целостности моего приложения. Я хотел получить хорошую идею, прежде чем реструктурировать свой бэкэнд.
Структура Firestore:
(collection) users: {
(document) ID1234567890: {
(collection) private: {
(document) address: {
line1: "",
line2: "",
city: "",
state: "",
zip: "",
country: "",
},
(document) billing: {
ssnLast4: "",
externalAccount: {},
},
(document) signatures: {
...
}
}
id: "",
userName: "",
firstName: "",
lastName: "",
avatarUrl: "",
...
phone: "",
email: "",
}
}
Firestore.rules:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isSignedIn() {
return request.auth != null;
}
// Users collection //
// TODO: does this match give access to all sub collections?
match /users/{userId} {
function isTrueUser() {
return resource.data.id == request.auth.uid;
}
// Anyone can create a user
allow create: if true;
// Only signed in users can read or list user profile data
allow read, list: if isSignedIn();
// Only that user can update their profile data
allow update: if isSignedIn() && isTrueUser();
// No one can delete a user
allow delete: if false;
}
match /users/{userId}/private/{documentName} {
function isTrueUser() {
return userId == request.auth.uid;
}
// Only that signed in user can create, update, read, or list their private documents
allow create, update, read, list: if isSignedIn() && isUserOwner();
// No one can delete a private document
allow delete: if false;
}
}
}