【问题标题】:Firebase Database: find by value without index accessFirebase 数据库:按值查找,无需索引访问
【发布时间】:2017-05-11 21:53:00
【问题描述】:

我想让用户按值查找记录,但我不希望他们能够列出所有记录。

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

我知道我可以在记录级别授予读取权限,并且用户将无法读取所有键,但是我仅限于键允许的字符,而我可能想使用 @987654321 @ 和其他字符。

所以我会将事物的路径存储在它的 path 属性中,然后通过 path 查找该事物;

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

我想让用户只有在知道路径的情况下才能找到东西。

问题是我只能通过搜索/thingsorderByChildequalTo 找到这个东西:

// 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 是否会强制我公开所有内容?

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-security


    【解决方案1】:

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

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

    如果您想提供无访问权限的搜索,则必须设置自己的搜索服务,该服务运行受信任的代码,然后将匹配项的路径返回给客户端。

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

    【讨论】:

    • 谢谢弗兰克。我希望避免为更简单的项目创建和维护服务器。
    【解决方案2】:

    我知道我应该能够避免为这样简单的事情维护服务器,所以我正在回答我自己的问题。

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

    再次查看后我发现limitations on keys in firebase,这是

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

    所以我可以简单地创建一个简单的映射来将禁止字符转换为允许字符并使用路径作为键,这解决了我的问题:用户只有知道路径才能访问事物,而路径可以看作为 URL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多