2016-12-27 67 views
1

我想让用户按值查找记录,但我不希望他们能够列出所有记录。Firebase数据库:按值查找没有索引访问

例如,我想创建一个wiki,并且我希望某些页面只能通过直接URL访问。

我知道我可以给记录级别上的读取权限,并且用户将无法读取所有密钥,但是然后我仅限于允许一个密钥的字符,而我可能想使用/和其他角色。

所以我会存储一个东西的路径在它的path属性,然后找到path的东西;

// database structure 
things 
    -KNi4OQXGXsHKYHVuTln 
     path: "should/not/be/listed/anywhere" 

我想让用户只有在他们知道路径时才能找到它。

的问题是,我只能用orderByChildequalTo搜索/things找到的东西:

// request with javascript 
firebase.database() 
    .ref('/things').orderByChild('path') 
    .equalTo("should/not/be/listed/anywhere") 
    .once('value', s=>{ }); 

这意味着我将不得不放弃读访问/things

// database security rules 
{ 
    "rules": { 
     "things": { 
      ".read": true, 
      ".indexOn": ["path"], 
      "$thingId": { 
       ".validate": "newData.hasChildren(['path']) && newData.child('path').isString()" 
      } 
     } 
    } 
} 

和有效让任何人都能看到我拥有的所有东西。有没有办法避免这种情况?

如果不是,那么这是否意味着Firebase迫使我尽快公布我所有的信息?

回答

2

为了能够在Firebase数据库中找到某些内容,您必须拥有对其的读取权限。没有办法避免这种情况。

我们通常将此称为“规则不是过滤器”,您可以在documentationthis answersearching for "rules are not filters" on Stack Overflow中找到更多关于它的信息。

如果您想要提供无访问搜索功能,则必须设置自己的搜索服务,该服务运行可信代码,然后将匹配项目的路径公开给客户端。

在Firebase之前设置此类搜索服务的常用方法是使用Firebase Flashlight library for ElasticSearch或使用云搜索服务,例如Algolia

+0

谢谢弗兰克。我希望避免为更简单的项目创建和维护服务器。 – Yura

1

我知道我应该能够避免维护一个简单的服务器,所以我回答我自己的问题。

我的实际问题是,我想让用户访问的东西,当他们知道的关键,但不希望他们看到所有的东西。我可以通过提供事物级别的访问权限和使用路径作为密钥来实现这一点,但这些密钥不允许我使用/,当然我也希望我的事物结构是平坦的。

在再一次寻找后,我发现了limitations on keys in firebase,这是

  • 最多768个字符
  • 禁止文字:. $ # [ ] /
  • 一些允许的字符:\ ! @ % & ? : ; , * = + < > () | " '^~ - _

,所以我可以只需创建一个简单的地图,将禁用的字符转换为允许的字符并将该路径用作关键字,从而解决了我的问题lem:用户只有在知道路径时才能访问它,而路径可以看作是一个URL。