Yas*_*tye 0 android kotlin firebase firebase-authentication firebase-realtime-database
我想添加 Firebase 实时数据库规则,它设置为默认值,但我无法使用身份验证,因为我的应用程序已经部署了数据库中的数据。
请帮忙,谢谢
sam*_*man 14
要授予任何用户对实时数据库 (RTDB) 的完整读/写访问权限,您可以使用以下全局读/写访问规则:
{
"rules": {
".read": true,
".write": true
}
}
Run Code Online (Sandbox Code Playgroud)
这些规则将允许任何人读取、写入、删除或更改数据库中的数据——包括删除整个数据库。这些规则还会触发 Firebase 定期发送电子邮件,警告您您的规则不安全。
您可以通过多种方法收紧数据库来防止此类滥用,而不是使用如此广泛的规则。
Firebase 安全规则记录在此处,其API 参考位于此处,您可以在此处管理它们。
由于您已表示不打算使用 Firebase 身份验证,因此我将省略这些示例,而是请您参阅这些示例的文档。由于您没有提供数据库中存储的数据的任何示例,因此我还将提出有关在数据库中存储汽车的各种示例。
假设您的应用程序包含一个可公开访问的汽车数据库,/cars其形状如下:
interface Car {
make: string,
model: string,
year: number,
type: string
}
Run Code Online (Sandbox Code Playgroud)
我们可以不使用上面完全公开的规则,而是让用户只能读/写节点/cars:
interface Car {
make: string,
model: string,
year: number,
type: string
}
Run Code Online (Sandbox Code Playgroud)
通过上述规则,您可以创建、更新、删除 下的任何节点/cars,但读/写/trains将被拒绝。这是因为安全规则默认为false(拒绝),除非另有定义。如果安全规则抛出错误(语法错误、数据丢失、对象类型错误),则会被视为false(拒绝)。
通过上述规则,任何用户都可以创建/cars/someId/path并填充大量不相关的数据。
为了纠正这个问题,我们可以在动态节点路径(例如cars/$carId)下定义节点并选择哪些字段将被读/写:
{
"rules": {
"cars": {
".read": true,
".write": true
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用这些规则,您现在可以创建Car对象并将其存储在数据库中。您将无法将数据添加到类似的位置/cars/someId/path,但您仍然可以像以前一样添加数据/cars/someId/make/path。
这就是数据验证规则的用武之地。我们可以确保节点的类型是我们所期望的(只要它是数字、字符串或布尔值):
{
"rules": {
"cars": {
// any car is readable
".read": true,
"$carId": {
"make": { ".write": true },
"model": { ".write": true },
"year": { ".write": true },
"type": { ".write": true }
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
上述规则强制对象的每个部分的类型Car,但它们并不能确保整个Car对象都存在。为了对节点的子节点强制验证,例如确保整个汽车对象都存在,我们将规则".validate"上移一级:
{
"rules": {
"cars": {
// any car is readable
".read": true,
"$carId": {
"make": { ".write": true, ".validate": "newData.isString()" },
"model": { ".write": true, ".validate": "newData.isString()" },
"year": { ".write": true, ".validate": "newData.isNumber()" },
"type": { ".write": true, ".validate": "newData.isString()" }
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过上述规则,您现在可以创建/更新/删除存储在其中的任何汽车,/cars只要它们看起来像一个Car对象即可。
简单地允许完整的写访问可能不是您想要的。通过调整".write": "true",我们可以对允许更改的数据应用额外的限制。
如果我们想让你只能创建/更新汽车,但不能删除它,我们可以使用:
{
"rules": {
"cars": {
// any car is readable
".read": true,
"$carId": {
// a car object must be complete
".validate": "newData.child('make').isString() && newData.child('model').isString() && newData.child('year').isNumber() && newData.child('type').isString()",
"make": { ".write": true },
"model": { ".write": true },
"year": { ".write": true },
"type": { ".write": true }
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们想让你只能创建一辆车,但不能更新/删除它,我们可以使用:
".write": "newData.exists()"
Run Code Online (Sandbox Code Playgroud)
如果我们想让你只能更新现有的汽车,而不能创建/删除它,我们可以使用:
".write": "!data.exists()"
Run Code Online (Sandbox Code Playgroud)
使用这些构建块,您现在应该能够在不阻塞现有应用程序的情况下收紧数据库。