我只想确保我正确理解了自定义声明,这是我要如何使用它们的一个示例:在我的应用程序中,我将每个用户与唯一的用户友好用户ID(例如“帐单”)相关联,其中一些我的安全规则使用此ID。用户信息和个人资料存储在文件/ users / {user}中,在该文件中,我还存储了相应的Firestore身份验证ID。
例如:在我的/ users / bill文件中
{ firstname: "William"
lastname: "Clinton"
...
userid: "Bill" // Case sensitive userid
uid: "faergq34tfawefawef" // A valid Firestore authentication id }
然后,我有一些集合要基于此用户标识定义访问权限,例如:
match /users/{user}/friends/{friend} {
allow create, update: if request.auth.uid != null
&& get(/databases/$(database)/documents/users/$(user)).data.uid==request.auth.uid;
}
使用自定义声明,规则可能看起来像这样:
match /users/{user}/friends/{friend} {
allow create, update: if request.auth.uid != null
&& request.auth.token.userid.lower() == user;
}
简单得多,每次执行规则时都保存1次读取。任何反馈?这有意义吗?只是确保在重写所有规则之前我不会丢失任何东西...
答案 0 :(得分:2)
我不确定为什么为什么通常的Firebase userid
一样独特并且总是在uid
中可用时,为什么您仍要在规则中使用request.auth.uid
。我认为userid
是仅对显示重要的内容。
自定义声明的目的是将数据附加到授予其特殊特权或权限的用户帐户。通常,人们在其中放一个布尔值即可授予“管理员”访问权限,或表明某种类型的组成员身份。
用户ID实际上并不是其中的任何一种。虽然不一定要在自定义声明中放入用户ID,但我看不出它在这里有什么价值。用户已经具有其Firestore UID的唯一ID,这应该是检查用户身份的首选方式。