ale*_*e00 4 ios firebase firebase-security swift firebase-storage
我的存储目录中有一个主"文件夹" users-projects,然后我为每个用户的项目创建文件夹.我想允许用户仅访问他们的项目以及邀请他们参与的项目,例如带有协作者的Dropbox或Google Drive文件夹.
他们在文档中说:
在文件元数据中包括组信息(例如组ID或授权uid列表)
所以这是我的问题:
我正在使用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 ?????
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是官方文档:https://firebase.google.com/docs/storage/security/user-security.
我认为正确的静态规则是:
allow read, write: if request.auth.uid == 'a-user-id' || request.auth.uid == 'another-user-id' || ...
Run Code Online (Sandbox Code Playgroud)
但我想你正在寻找动态规则:)
对于所有者来说,使用文件夹名称设置动态规则非常简单:
match /users-projects/{projectId}/{userId} {
allow read, write: if request.auth.uid == userId
Run Code Online (Sandbox Code Playgroud)
对于受邀用户等更复杂的情况,您可以尝试使用自定义元数据在文件中存储受邀的uid,并将其与访问该资源的用户ID进行匹配,例如:
allow read: if resource.metadata.invited.matches(request.auth.uid);
Run Code Online (Sandbox Code Playgroud)
自定义元数据值只能是字符串,因此我建议您将它们存储为逗号分隔值,以便您可以轻松编辑它们,同时在访问规则中使用简单匹配.
注意:这只是可扩展的,而invitedUids.join(',')长度短于自定义元数据值的最大长度.(我不知道那个价值).如果您的应用程序不是为了接受数百个受邀用户而构建的,那么它应该没问题,否则您可能需要设置服务器端访问机制,为每个受邀用户构建一个唯一的下载链接,而不是依赖于简单的规则.
此外,我认为您不能使用令牌groupId值来强制执行您的案例中的访问安全性(如文档中所述),因为您many-to-many在用户和文件夹/文件之间存在关系.(用户不仅属于一个组)
那么,回答你的问题:
resource规则中的对象仅适用于文件,如果使用元数据来强制访问,如果它们共享相同的访问规则,则需要在文件夹中的每个文件上更新它们