我正在尝试复制官方Firestore docs中的示例。您需要了解的所有信息都在屏幕截图上。是错误还是我错过了什么?
答案 0 :(得分:3)
关键是通读评论。
许多应用程序将访问控制信息存储为文档中的字段 数据库。 Cloud Firestore安全规则可以动态地允许或 根据文档数据拒绝访问:
然后
///如果文档的“可见性”字段设置为“公开”,则允许用户读取数据
如果您查看指南中提供的示例数据
<?php
$client = new SoapClient('http://services.chromedata.com/Description/7b?wsdl', array('trace' => 1));
$account = ['number'=>"", 'secret'=>"", 'country'=>"US", 'language'=>"en"];
$switch = ["ShowAvailableEquipment", "ShowExtendedTechnicalSpecifications", "ShowExtendedDescriptions"];
$vin = $_POST["b12"];
$result = $client->describeVehicle([
'accountInfo' => $account,
'switch' => $switch,
'vin' => $vin
]);
$resultxml = htmlentities($client->__getLastResponse()) . "\n";
$dom = new DOMDocument();
$dom->loadXML($resultxml);
$techData = [];
foreach ( $dom->getElementsByTagName('technicalSpecification') as $techSpec ) {
$id = $techSpec->getElementsByTagName('titleId')->item(0)->nodeValue;
$techData [$id]= $techSpec->getElementsByTagName('value')->item(0)->getAttribute("value")."<br>";
}
print_r($techData);
echo "<br>";
没有“可见性”字段,但是有名称,州名字段等。
如果要使用该数据集,请在每个城市中添加一个“可见性”字段,并将其值设置为“公开”
let citiesRef = db.collection("cities")
citiesRef.document("SF").setData([
"name": "San Francisco",
"state": "CA",
"country": "USA",
"capital": false,
"population": 860000,
"regions": ["west_coast", "norcal"]
])
答案 1 :(得分:2)
问题在于/cities/moscow
上没有实际文档
答案 2 :(得分:1)
更多的解释将使Manidos的答案很好。
似乎resources
仅应用于涉及已写入数据的规则;例如delete
,read
,update
等
如果要对“将要”写入的数据设置规则,请使用getAfter
。
答案 3 :(得分:1)
问题是 - 作为 manidos - 指出文件 /cities/moscow 不存在,因此该文件不可访问。但是,指定规则的更简洁方法是:
allow read: if (resource == null) || (resource.data.visibility == 'public')
它允许应用程序查询不存在的数据,而不会因安全异常而爆炸。
答案 4 :(得分:0)
我仍在学习,但问题是
允许读取:if (resource == null) || (resource.data.visibility == 'public')
是当您对 /cities/{doc} 使用此类规则时。从我可以看到的资源 == null 每当您搜索没有确切文档 ID 的文档时;上面的规则将显示 /cities/{doc} 的所有内容,私有和公共,因为资源总是 == 空。
根据我已经能够拼凑的内容,只要在可以返回 1 个或多个文档的匹配项中,就必须使用 get(...) 语句直接访问文档的数据,所以
get(/database/...).data.visibility == 'public'