Restrict querying by a certain child value in security rules

前端 未结 1 447
鱼传尺愫
鱼传尺愫 2021-01-15 03:04

I\'m struggling to come up with the best way to structure part of my database and its associated security rules.

I have chat groups, and users can be added to those

相关标签:
1条回答
  • 2021-01-15 03:27

    Read rules are enforced at the location where you attach a listener.

    So in your case that is groupMessages/-Kb9fw20GqapLm_b8JNE. If your user has read permission there the listener is allowed. If the user does not have read permission, the listener is rejected/cancelled.

    This means that rules cannot be used to filter data. We often refer to this as "rules are not filters" and it's one of the most common pitfalls for developers who are new to Firebase's security model. See:

    • the section rules are not filters in the Firebase documentation
    • previous questions about Firebase that mention "rules are not filters"

    By themselves your rules are not wrong: they only allow access to each specific child if it's not too old. They just don't allow you to run a query on groupMessages/-Kb9fw20GqapLm_b8JNE anymore.

    The common way to work around this is to have a separate structure (commonly called an "index") with the keys of the items that your query would otherwise return. In your case it looks like that might turn into a index for each user with the keys of all messages after they joined.

    But I'll be honest, it sounds like you're trying to use security rules in a SQL way here. It seems unlikely that the user isn't allowed to see older messages. More likely is that you don't want the user to be bother by the older messages. In that case, I'd just solve it with a query (as you already have) and remove the ".read" rule.

    0 讨论(0)
提交回复
热议问题