Firebase规则混淆

时间:2016-10-31 01:06:56

标签: firebase-realtime-database firebase-security

我对Firebase规则结构感到非常困惑。基本上我有一个名为' Transactions'的根文件夹,包含许多再次包含数据的childByAutoID,完全如下:

Transactions {
    autoID1 {
        transactionID: whatever,
        timeCreated: whatever,
        "amount": whatever,
        "sender": whatever,
        "receiver:whatever"
    }
}

我现在正尽力实施最佳安全规则。因此,我尝试做这样的事情:

"Transactions": {
    ".write": "auth !== null",
    "$transactionAutoID": {
        "timeCreated": {
            ".write": "auth !== null && data.child('sender').val() === auth.uid || data.child('receiver').val() === auth.uid",
            ".read": "auth !== null && data.child('sender').val() === auth.uid || data.child('receiver').val() === auth.uid"
        }
    }
}

所以基本上,从我学到的东西,以及我正在努力的方面来看,用户能够写任何东西,即使在通配符ID($ transactionAutoID)'中也是如此。我知道这是因为我已经设置了' .write'在交易中' auth!== null' - 但如果我没有这个设置,用户可能无法读取或写入任何交易数据。 (我的规则默认设置为false)。

如果我只希望用户能够在Transactions中创建新的子节点,但是如果它们不是发送者或接收者,则不能写入任何事务密钥,我将如何继续?

1 个答案:

答案 0 :(得分:1)

一旦在节点上授予了权限,就不能在较低级别的节点上将其删除。

所以,如果你看一下:

Transactions/$transactionId/timeCreated

Transactions上的写规则毫无意义,因为它试图收紧"Transactions": { ".write": "auth !== null", "$transactionAutoID": { "timeCreated": { ".read": "auth !== null && data.child('sender').val() === auth.uid || data.child('receiver').val() === auth.uid" } } } 的权限。

所以现在它的功能如下:

Transactions/$transactionId/timeCreated

如果您想明确限制用户可以对"Transactions": { "$transactionAutoID": { ".write": "auth !== null && ( !data.exists() || ( newData.child('sender').val() === auth.uid || newData.child('receiver').val() === auth.uid)" ) )" } } 执行的操作,则您必须在验证规则中执行此操作,或者(更有可能)将所有规则放在事务本身上:

data Sample = Sample
  { hello :: String
  , quiet :: Bool }

sample :: Parser Sample
sample = Sample
  <$> strOption -- Q1
      ( long "hello"
     <> metavar "TARGET" -- Q2
     <> help "Target for the greeting" )
  <*> switch
      ( long "quiet"
     <> help "Whether to be quiet" )

简而言之:您可以在经过身份验证后编写交易,而 交易尚不存在您是交易的发件人或收件人。