我对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中创建新的子节点,但是如果它们不是发送者或接收者,则不能写入任何事务密钥,我将如何继续?
答案 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" )
简而言之:您可以在经过身份验证后编写交易,而 交易尚不存在或您是交易的发件人或收件人。