Обновление после вашего комментария «Намерение состоит в том, чтобы расширить правило, чтобы пользователь мог управлять чем-либо, кроме {userId}
»:
service cloud.firestore {
match /databases/{database}/documents {
match /user-read-only/{userId}/{document=**} {
allow read, update, delete: if request.auth.uid == userId;
allow create: if request.auth.uid != null;
}
}
}
Просто обратите внимание, что правило create
( скопировано из вашего вопроса ) позволяет любому аутентифицированному пользователю писать в любую папку {userId}
.
(Напротив, если вы просто хотите объявить правило для business/settings
sub-collection и doc), нужно выполнить следующее:
service cloud.firestore {
match /databases/{database}/documents {
match /user-read-only/{userId}/business/settings {
allow read, update, delete: if request.auth.uid == userId;
allow create: if request.auth.uid != null;
}
}
}
Чтобы убедиться, что userId
заполнен правильно, вы можете добавить его в качестве поля в документ при его создании и проверить в правилах для create
, что он правильный, следующим образом:
allow create: if request.auth.uid != null && request.auth.uid == request.resource.data.userId
;
С другой стороны, Firebase Auth автоматически гарантирует, что request.auth.uid
заполнен правильно.
Наконец, вы можете посмотреть это очень хорошее видео от команды Firebase о правилах безопасности: https://www.youtube.com/watch?v=eW5MdE3ZcAw
Вот HTML-страница, используемая для тестирования. Просто измените значение userId
с другим идентификатором пользователя.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
<script src="https://www.gstatic.com/firebasejs/5.9.3/firebase.js"></script>
<script>
// Initialize Firebase
var config = {
apiKey: 'xxxxx',
authDomain: 'xxxxx',
databaseURL: 'xxxxx',
projectId: 'xxxxx'
};
firebase.initializeApp(config);
firebase
.auth()
.signInWithEmailAndPassword('xxxxxx@gmail.com', 'yyyyyyy')
.then(userCredential => {
const userId = userCredential.user.uid;
// Replace with another userId to test
//e.g. const userId = 'l5Wk7UQGRCkdu1OILxHG6MksUUn2';
firebase
.firestore()
.doc('user-read-only/' + userId + '/business/settings4')
.set({ tempo: 'aaaaaaa' })
.then(() => {
return firebase
.firestore()
.doc(
'user-read-only/' + userId + '/testC/1/collec/2'
)
.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);
});
});
</script>
</head>
<body>
</body>
</html>