我试图保护对集合的请求以允许任何单个get
,但仅在匹配特定键的情况下才允许list
。
数据库结构是这样的:
posts
post1
content: "Post 1 content"
uid: "uid1"
post2
content: "Post 2 content"
uid: "uid1"
post3
content: "Post 3 content"
uid: "uid2"
我从Vue进行的Firestore查询:
// Only return posts matching the requested uid
db
.collection("posts")
.where("uid", "==", this.uid)
我想拥有的安全规则将是这样的:
match /posts/{post} {
allow get: if true // this works
allow list: if [** the uid in the query **] != null
我想这样做,因此,如果您知道特定用户的帖子uid
,但不能列出系统的所有posts
,则可以列出他们的帖子。
在这种情况下,是否可以访问安全规则中所请求的.where()
,或者如何编写这样的规则或构造我的数据?
相关与学分:
表面上,我可以对查询的limit
,offset
和orderBy
发出请求。但是where
上没有任何内容。请参阅:#1和#2。
我从this question复制粘贴了很多内容。我看不到被接受的答案如何回答问题。似乎它回答了允许用户list
其他一些用户的帖子的另一种情况。那不是我的情况。就我而言,公共是公共。因此,它似乎无法回答我的主要问题。
当前,没有使用安全规则的方法来检查查询中是否使用了字段。您唯一可以做的就是仅使用您允许的值来验证文档字段是否已用作过滤器。
相反,请考虑将足够的数据复制到这样组织的另一个集合中:
user-posts (collection)
{uid} (document using UID as document ID)
posts (subcollection)
{postId} (documents using post ID as document ID)
这将要求客户端调出一个UID进行查询,以获取与该用户相关联的所有帖子。您可以根据需要存储尽可能多的有关过帐文档的信息,以便满足查询的目的。
这样的数据复制在NoSQL数据库中很常见。如果您不希望用户在任何给定时刻查询所有帖子,则甚至可以将其设置为新的默认结构。请注意,命名为“帖子”子集合的collection group query仍会在所有用户的所有帖子中查询,因此您必须make sure your security rules are set up以便仅在允许它发生时启用此功能。
还请注意,通常不会向用户隐藏UID,特别是如果您的网站本质上是协作的,并且您在单个页面上合并了多个用户的数据。