仅当节点包含用户的 uid 时才授予用户访问权限?
Grant access to a user only if the node contains their uid?
所以,我有一个具有消息传递功能的应用程序,两个用户可以在其中互相发送消息。我在 "messages" 节点中构建我的数据,其中每个节点都是两个用户之间的消息线程。每个节点都以正在通信的两个用户的两个 uid 命名,按字母顺序排序。
例如,
如果用户 (dd77gg) 和用户 (zz22ss) 在对话中,该节点将被命名为 "dd77ggzz22ss"。我知道您可以通过
在安全规则中授予访问权限
{
"rules": {
"messages": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
但是,在我的例子中,节点不是简单地命名为 $uid,而是两个 uid 合并在一起。因此,我的问题 是,仅当在节点名称的某处找到当前用户的 uid 时,我如何简单地授予访问权限?
首先,不要按字母顺序对您的 uid 进行排序,这似乎是个好主意,但它不是确定性的。例如。假设这两个 uid 是 'cat' 和 'bca'。按字母顺序对它们进行排序会得到 'aabcct'。现在假设您有另外两个 uid:'cat' 和 'cba'。如果你要对它们进行排序,你将得到相同的 uid 串联,你将得到 aabbcct。这将导致以前的对话数据被覆盖。连接两个 uid 实际上是最好的方法。你不需要对它们进行排序,你只需要有一种连接它们的确定性方法。即:我应该先放谁的 uid。
现在要回答您的问题,您只需使用 firebase 规则中的 contains 方法即可。
{
"rules": {
"messages": {
"$uid": {
".read": "$uid.contains(auth.uid),
".write": "$uid.contains(auth.uid)"
}
}
}
}
您只需检查它是否包含其中一个用户 ID,如果包含,那么他们当然可以阅读它。希望对您有所帮助。
所以,我有一个具有消息传递功能的应用程序,两个用户可以在其中互相发送消息。我在 "messages" 节点中构建我的数据,其中每个节点都是两个用户之间的消息线程。每个节点都以正在通信的两个用户的两个 uid 命名,按字母顺序排序。
例如,
如果用户 (dd77gg) 和用户 (zz22ss) 在对话中,该节点将被命名为 "dd77ggzz22ss"。我知道您可以通过
{
"rules": {
"messages": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
但是,在我的例子中,节点不是简单地命名为 $uid,而是两个 uid 合并在一起。因此,我的问题 是,仅当在节点名称的某处找到当前用户的 uid 时,我如何简单地授予访问权限?
首先,不要按字母顺序对您的 uid 进行排序,这似乎是个好主意,但它不是确定性的。例如。假设这两个 uid 是 'cat' 和 'bca'。按字母顺序对它们进行排序会得到 'aabcct'。现在假设您有另外两个 uid:'cat' 和 'cba'。如果你要对它们进行排序,你将得到相同的 uid 串联,你将得到 aabbcct。这将导致以前的对话数据被覆盖。连接两个 uid 实际上是最好的方法。你不需要对它们进行排序,你只需要有一种连接它们的确定性方法。即:我应该先放谁的 uid。
现在要回答您的问题,您只需使用 firebase 规则中的 contains 方法即可。
{
"rules": {
"messages": {
"$uid": {
".read": "$uid.contains(auth.uid),
".write": "$uid.contains(auth.uid)"
}
}
}
}
您只需检查它是否包含其中一个用户 ID,如果包含,那么他们当然可以阅读它。希望对您有所帮助。