Javascript 从应用程序级别控制Firebase存储规则

Javascript 从应用程序级别控制Firebase存储规则,javascript,firebase,firebase-storage,firebase-security,Javascript,Firebase,Firebase Storage,Firebase Security,我在Firestore中有一个在云中存储用户文件的应用程序。我的问题是,我是否可以通过应用程序设置规则?在这一点上,我有这样的想法: rules_version = '2'; function isAdmin() { return request.auth !=null && request.auth.uid in [ "Xk60AqYDM4ONw5VOR0v89c8RF9P2", "3e8kXyjUvUY8W

我在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应用程序设置这些规则。这有什么命令吗?有人可以帮助我吗?

您不能从前端应用程序更改安全规则的代码

Firestore安全规则中,您可以根据某些Firestore文档的存在或文档字段中包含的值来创建规则的一些条件语句(例如
允许读取
)。为此,您将使用
get()
exists()
函数,如文档中所述。因此,您可以从前端修改这些Firestore文档的值,以动态修改安全规则语句的结果

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


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

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


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

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

Firestore安全规则中,您可以根据某些Firestore文档的存在或文档字段中包含的值来创建规则的一些条件语句(例如
允许读取
)。为此,您将使用
get()
exists()
函数,如文档中所述。因此,您可以从前端修改这些Firestore文档的值,以动态修改安全规则语句的结果

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


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

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


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

您所说的“通过应用程序设置规则”是什么意思?动态更改用户ID的值(即Xk60AqYDM4ONw5VOR0v89c8RF9P2)?@RenaudTarnec是的,精确管理用户及其权限。您所说的“通过应用程序设置规则”是什么意思?动态更改用户ID的值(即Xk60AqYDM4ONw5VOR0v89c8RF9P2)?@RenaudTarnec是的,精确管理用户及其权限。小型应用程序会收费吗?这是关于Firebase中的功能。你是说有成本吗?使用自定义声明(以及除phone auth之外的其他身份验证服务,请参阅)不会产生任何成本。事实上,会产生一些成本的是我在回答开始时提到的基于Firestore文档的解决方案:由于此解决方案基于Firestore文档,您将支付文档读取成本。小型应用程序是否会收费?这是关于Firebase中的功能。你是说有成本吗?使用自定义声明(以及除phone auth之外的其他身份验证服务,请参阅)不会产生任何成本。实际上,会产生一些成本的是基于Firestore文档的解决方案,我在回答的开头提到过:由于此解决方案基于Firestore文档,因此您需要支付文档读取的成本。