我的存储目录中有一个名为users-projects
的主“文件夹”,然后我为每个用户的项目创建文件夹。我希望允许用户仅访问他们的项目以及邀请他们加入的项目,例如包含协作者的Dropbox或Google云端硬盘文件夹。
在文档中他们说:
包括组信息(例如组ID或授权列表) 文件元数据中的uids)
所以这是我的问题:
我正在使用Swift编写iOS应用程序。
以下是规则的实际代码:
service firebase.storage {
match /b/on-team.appspot.com/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
match /users-projects {
match /{projectId} {
allow read, write: if ?????
}
}
}
}
以下是官方文档:https://firebase.google.com/docs/storage/security/user-security。
答案 0 :(得分:5)
我认为正确的静态规则是:
allow read, write: if request.auth.uid == 'a-user-id' || request.auth.uid == 'another-user-id' || ...
但我猜您正在寻找动态规则:)
对于所有者来说,使用文件夹名称设置动态规则非常简单:
match /users-projects/{projectId}/{userId} {
allow read, write: if request.auth.uid == userId
对于受邀用户等更复杂的案例,您可以尝试using the custom metadata将受邀的uid存储在文件中,并将其与访问该资源的用户ID进行匹配,例如:
allow read: if resource.metadata.invited.matches(request.auth.uid);
自定义元数据值只能是字符串,因此我建议您将它们存储为逗号分隔值,以便您可以轻松编辑它们,同时在访问规则中使用简单匹配。
注意:这只是可扩展的,而invitedUids.join(',')
长度短于自定义元数据值的最大长度。 (我不知道那个价值)。如果您的应用程序不是为了接受数百个受邀用户而构建的,那么它应该没问题,否则您可能需要设置服务器端访问机制,为每个受邀用户构建一个唯一的下载链接,而不是依赖于简单的规则。
此外,我认为您不能使用令牌groupId
值来强制执行您的案例中的访问安全性(如文档中所述),因为您在用户和用户之间存在many-to-many
关系文件夹/文件。 (用户不只属于一个组)
所以,回答你的问题:
resource
对象仅适用于文件,如果使用元数据强制访问,如果它们共享相同的访问规则,则需要更新文件夹中的每个文件答案 1 :(得分:2)
使用用户标识
将单个项目存储在目录中
service firebase.storage {
match /b/on-team.appspot.com/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
match /users-projects/{user_id} {
allow read, write: if request.auth.uid == user_id
}
}
}