Поскольку операция, для которой требуется запись, ограничена (только вставка новых элементов), у вас есть несколько вариантов:
- Вы можете запретить запись для клиентов конечного пользователя и вместо этого отправить запрос в облакофункция, которая выполняет именно ту операцию, которая вам нужна (после проверки ввода или любых других проверок, которые вам могут потребоваться, ограничение скорости и т. д.). Облачные функции игнорируют правила безопасности, поскольку они запускаются с административным доступом.
Вот пример функции узла, который выполняет запись в базу данных в реальном времени, и он успешно выполняется, когда и чтение, и запись ложны в безопасностиправила (ваш связанный package.json, очевидно, должен зависеть от firebase-admin и firebase-functions):
const functions = require('firebase-functions');
// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();
let db = admin.firestore();
// This pushes the "text" parameter into the RDB path /messages/(hash)/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
// Grab the text parameter.
const original = req.query.text;
// Push the new message into the Realtime Database using the Firebase Admin SDK.
const snapshot = await admin.database().ref('/messages').push({original: original});
// Respond to the user (could also be a redirect).
res.send('got it: ' + snapshot.ref.toString());
});
Возможно, вы захотите прочитать о том, как SDK администратора Firebase контролирует доступ но в облачной функции по умолчанию у вас должны быть права администратора.
- Используя язык правил , вы можете разрешить только операции создания. Это устраняет возможность клиента обновлять или удалять существующие данные. Это не так безопасно, как предыдущий метод, но может подойти вам:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read;
allow create;
}
}
}
Кроме того, обратите внимание, что это работает для firestore (который вы используете), но не для базы данных в реальном времени.
Очевидно, что оба эти метода могут в некотором роде использоваться для записи большого количества данных в вашу базу данных, хотя первый дает вам гораздо больший контроль над тем, что разрешено (например, вы можете предотвратить больше, чем N записей, илибольше, чем Y байт на запись). Последний по-прежнему позволяет любому создавать то, что он хочет.