首页 > 解决方案 > 从应用程序级别控制 Firebase 存储规则

问题描述

我在 Firestore 中有一个将用户文件存储在云中的应用程序。这是我的问题,我可以通过应用程序设置规则吗?在这一点上,我有这样的事情:

rules_version = '2';

function isAdmin() {
   return request.auth !=null && request.auth.uid in [
        "Xk60AqYDM4ONw5VOR0v89c8RF9P2",
        "3e8kXyjUvUY8WOHp75Z1Y278OO63"
    ];
}

function companyJP(){
       return request.auth !=null && request.auth.uid in [
        "CUTSs8oziESYDzPqyv2ac7XOKMD2",
        "gqTFDiP7lYeaCaYFd9SG52LCMYF3"
    ];
}

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userID}/{allPaths=**} {
      allow read, write: if request.auth.uid == userID;
    }
    match /files/{groupId}/{allPaths=**} {
        allow read: if resource.metadata.owner == request.auth.token.groupId;
        allow write: if request.auth.token.groupId == groupId;
        }
    match /files/adminFiles/{allPaths=**} {
      allow read, write: if isAdmin(); 
    }
    match /files/companyJP/{allPaths=**} {
      allow read, write: if firmaJP(); 
    }
  }
}

我想通过 Web 应用程序设置这些规则。有什么命令吗?有谁能帮助我吗?

标签: javascriptfirebasefirebase-storagefirebase-security

解决方案


您无法从前端应用程序更改安全规则的代码。

您可以在Firestore安全规则中做的是将规则的一些条件语句(例如allow read)基于某些 Firestore 文档的存在或文档字段中包含的值。为此,您将使用get()andexists()函数,如文档中所述。因此,您可以从前端修改这些 Firestore 文档的值,以动态修改安全规则语句的结果。

但是,在您的情况下,您正在为Cloud Storage编写规则,并且在 Cloud Storage 安全规则中,无法访问存储在 Firestore 中的数据或文档。


一种解决方案是使用自定义声明。您将能够通过自定义声明实现基于角色的访问控制。具体来说,您可以将companyJP属性分配给用户的帐户CUTSs8oziESYDzPqyv2ac7XOKMD2(请阅读文档以获取更准确的详细信息)。

您可以从您的前端应用程序中,允许某些特定(管理员)用户更改其他用户的声明(即角色)。由于自定义声明只能由 Firebase Admin SDK 从特权服务器环境设置,因此最简单的方法是使用您从前端调用的可调用云函数(并在其中检查调用云的用户函数具有管理员权限)。

您可能会对这篇文章感兴趣,该文章解释了如何构建一个模块,该模块允许具有特定管理员角色的 Firebase 最终用户创建其他用户并为他们分配其他特定用户角色。


推荐阅读