【问题标题】:Control Firebase Storage rules from the application level从应用程序级别控制 Firebase 存储规则
【发布时间】:2021-03-28 05:01:45
【问题描述】:

我在 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(); 
    }
  }
}

我想通过网络应用程序设置这些规则。有什么命令吗?有没有人可以帮助我?

【问题讨论】:

  • “通过应用程序设置规则”是什么意思?动态改变 userIds 的值(即 Xk60AqYDM4ONw5VOR0v89c8RF9P2)?
  • @RenaudTarnec 是的,精确管理用户及其权利。

标签: javascript firebase firebase-storage firebase-security


【解决方案1】:

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

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

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


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

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

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

【讨论】:

  • 小型应用程序会收费吗?这是关于 Firebase 中的功能。
  • 你的意思是任何费用吗? 使用自定义声明(以及其他身份验证服务,除了电话身份验证,请参阅here不会产生任何费用。实际上,我在回答开头提到的基于Firestore文档的解决方案会产生一些成本:由于该解决方案是基于Firestore文档的,因此您将支付阅读文档的费用。
猜你喜欢
  • 1970-01-01
  • 2017-08-11
  • 2022-08-19
  • 2020-07-05
  • 1970-01-01
  • 2021-01-03
  • 2020-11-28
  • 2017-06-16
相关资源
最近更新 更多