如何在无需身份验证的情况下添加Firebase数据库规则?

问题描述 投票:0回答:2

我想添加 Firebase 实时数据库规则,它设置为默认值,但我无法使用身份验证,因为我的应用程序已经部署了数据库中的数据。

请帮忙,谢谢

android firebase kotlin firebase-realtime-database firebase-authentication
2个回答
14
投票

要授予任何用户对实时数据库 (RTDB) 的完整读/写访问权限,您可以使用以下全局读/写访问规则:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

这些规则将允许任何人读取、写入、删除或更改数据库中的数据 - 包括删除整个数据库。这些规则还会触发 Firebase 定期发送电子邮件,警告您您的规则不安全。


您可以通过多种方法加强数据库来防止此类滥用,而不是使用如此广泛的规则。

Firebase 安全规则记录在此处,其 API 参考位于此处,您可以在此处管理它们

因为您已表示不打算使用 Firebase 身份验证,所以我将省略这些示例,而是请您参阅这些示例的文档。由于您没有提供数据库中存储的数据的任何示例,我还将提出有关在数据库中存储汽车的各种示例。


假设您的应用程序包含

/cars
下可公开访问的汽车数据库,其形状如下:

interface Car {
  make: string,
  model: string,
  year: number,
  type: string
}

我们可以不使用上面完全公开的规则,而是让用户只能读/写

/cars
节点:

{
  "rules": {
    "cars": {
      ".read": true,
      ".write": true
    }
  }
}

通过上述规则,您可以创建、更新、删除

/cars
下的任何节点,但对
/trains
的读/写将被拒绝。这是因为安全规则默认为
false
(拒绝),除非另有定义。如果安全规则抛出错误(语法错误、数据丢失、对象类型错误),则会被视为
false
(拒绝)。

通过上述规则,任何用户都可以创建

/cars/someId/path
并用大量不相关的数据填充它。

为了纠正这个问题,我们可以定义动态节点路径下的节点(例如

cars/$carId
)并选择哪些字段将被读/写:

{
  "rules": {
    "cars": {
      // any car is readable
      ".read": true,

      "$carId": {
        "make":  { ".write": true },
        "model": { ".write": true },
        "year":  { ".write": true },
        "type":  { ".write": true }
      }
    }
  }
}

使用这些规则,您现在可以在数据库中创建并存储

Car
对象。您将无法将数据添加到
/cars/someId/path
等位置,但您仍然可以像以前一样将数据添加到
/cars/someId/make/path

这就是数据验证规则的用武之地。我们可以确保节点的类型是我们所期望的(只要它是数字、字符串或布尔值):

{
  "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()" }
      }
    }
  }
}

上述规则强制执行

Car
对象的每个部分的类型,但它们并不能确保整个
Car
对象都存在。为了对节点的子节点强制进行验证,例如确保整个汽车对象都存在,我们将
".validate"
规则上移一级:

{
  "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 }
      }
    }
  }
}

通过上述规则,您现在可以创建/更新/删除存储在

/cars
下的任何汽车,只要它们看起来像
Car
对象即可。


简单地允许完整的写访问可能不是您想要的。通过调整

".write": "true"
,我们可以对允许更改的数据应用额外的限制。

如果我们想让你只能创建/更新汽车,但不能删除它,我们可以使用:

".write": "newData.exists()"

如果我们想让你只能创建一辆车,但不能更新/删除它,我们可以使用:

".write": "!data.exists()"

如果我们想让你只能更新现有的汽车,而不能创建/删除它,我们可以使用:

".write": "data.exists() && newData.exists()"

使用这些构建块,您现在应该能够在不阻塞现有应用程序的情况下收紧数据库。


0
投票

您可以使用 Auth Rest api 避免所有 javascript 设置。

<?php
 

 

$url = 'https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=[Key-from_web_fire_base_setting]';
 
 
 
$postParameter = array (
    'email' => '[email protected]',
    'password' => 'secrutpass',
    'returnSecureToken' => true,
    
 
    );
     
    
$postParameter1 = json_encode($postParameter);
//print_r($postParameter);
 
 
$header =array("Content-Type: application/json");
 
$curl = curl_init($url);


curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);

curl_setopt($curl, CURLOPT_PORT, 443);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 2);
curl_setopt($curl, CURLOPT_SSLVERSION, 1);

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
 
 

//curl_setopt($curl, CURLOPT_GET,true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postParameter1);
$response = curl_exec($curl);
$response_info = curl_getinfo($curl);
//print_r($response);
$result = json_decode($response);
echo '<pre>' , print_r($result, true), '</pre>' ;
$x = 'kind';
echo $result->$x;
© www.soinside.com 2019 - 2024. All rights reserved.