2017-08-29 68 views
1

我有我的结构如下数据:火力地堡阅读基础上的关键数据规则

writings: { 
    'xxx-key-xxx': { 
     'user-id': 'xxxxx', 
     'title': 'title', 
     'content': 'content' 
    } 
} 

而且我想允许读取访问用户只有他的证件:

{ 
    "rules": { 
    "writings": { 
     ".read": "auth !== null && (root.child('writings').child('user-id').val() === auth.uid)", 
     } 
    } 
} 

但这不起作用。我怀疑我没有正确安装钥匙user-id。任何想法?

+0

什么不行?你能否显示你不想工作的代码?反之亦然:无法阅读的代码,您想要的代码? –

+0

我在Firebase控制台中模拟并且被拒绝。我将存储有'uid'的数据设置为模拟器中使用的UID,但无法读取。 –

+0

模拟的路径是'/ writings /'。我想获取用户拥有的所有文字。 –

回答

2

您正在比较auth.uid与路径/writings/user-id的值,该路径缺少密钥xxx-key-xxx,所以这将始终为假,因为此路径上的数据不存在。您可以更改您的规则以获得孩子的密码,但是,这会限制您的.read许可权来阅读个人writings儿童,例如

{ 
    "writings": { 
    "$wid": { 
     ".read": "auth !== null && root.child('writings/$wid/user-id').val() === auth.uid" 

或等价

 ".read": "auth !== null && data.child('user-id').val() === auth.uid" 
    } 
    } 
} 

利用这些规则,你会看到Permission Denied试图读取/writings时 - 你必须逐个读取文件,所以你必须知道每个文档的关键。现在我们知道我们需要的是每个文档的关键字,我们需要找到一种检索它们的方法。

表示这样的关系的一种常见方式是通过扇出数据。我们有用户的uid,我们需要他们拥有的文档的密钥。如果您要维护另一个存储每个用户文档的密钥的根节点,那么您可以引用该位置来检索用户的文档。

{ 
    "user-writings": { 
    "$uid": { 
     ".read": "auth.uid === $uid", 
     "$wid": { 
     ".write": "auth.uid === $uid" 
     } 
    } 
    }, 
    "users": { 
    ... 
    }, 
    "writings": { 
    "$wid": { 
     ".read": "auth.uid === data.child('user-id').val()", 
     ".write": "auth.uid === newData.child('user-id').val()" 
    } 
    } 
} 

这些规则确保用户只能凭借只具有user-writings/$uid访问自己的文档的按键查看自己的文件。当用户创建书写时,他们还需要写入user-writings/$uid/$wid将值设置为true

现在要检索属于用户的文档,您需要用用户的uid查询位置user-writings/$uid以检索密钥,然后必须获取用户拥有的每个writings/$wid的数据。它可能适合您将writings完全丢弃并将每个用户的文档存储在数据库中相应的位置(user-writings/$uid)。