Firebase 用于检查角色或公司的Firestore规则函数

Firebase 用于检查角色或公司的Firestore规则函数,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,在我们开始生产之前,我需要在我的应用程序中实现基于角色的授权。我有一个功能,可以检查用户是否只访问他们公司的数据。我还需要确保角色为“超级用户”、“测试人员”或“经理”的用户也可以访问数据,即使他们不是公司的一部分。我看过其他基于角色的实现,但它们似乎没有解决必须检查公司或角色的情况 我这里有一条规则,上面有OR语句: allow read: if exists(/databases/$(database)/documents/companies/$(company)/users/$(reque

在我们开始生产之前,我需要在我的应用程序中实现基于角色的授权。我有一个功能,可以检查用户是否只访问他们公司的数据。我还需要确保角色为“超级用户”、“测试人员”或“经理”的用户也可以访问数据,即使他们不是公司的一部分。我看过其他基于角色的实现,但它们似乎没有解决必须检查公司或角色的情况

我这里有一条规则,上面有OR语句:

allow read: if exists(/databases/$(database)/documents/companies/$(company)/users/$(request.auth.uid)) 
|| hasRole(['SuperUser', 'Manager', 'Tester']);
我将此作为hasRoles的函数:

function hasRole(roles) {
    return get("/databases/$(database)/documents/companies/Seva Development/users/$(request.auth.uid)").data.roles.hasAny(roles);
}
当我添加此函数时,用户被拒绝访问,即使OR语句的左侧为true。我只能假设函数有问题,但我无法从firebase文档中找到问题所在

我试图访问的文档如下所示:

如何修改此函数以允许我检查用户是否是我们组织的一部分,是否具有指定的角色之一

如果您担任该职位,但不是公司的一部分,则此功能有效:

allow read: if isUserCompany(company) 
                        || hasRole(['SuperUser', 'Manager', 'Tester']);
但如果你是公司的一员,没有这个角色,它就会失败。我不明白的是,如果你是公司的一部分,但没有这个角色,这是可行的:

allow read: if isUserCompany(company) 
因此,左侧起作用,右侧起作用。但他们不在一起工作

如果我写下:

allow read: if isUserCompany(company) || false; 

这让我假设,如果角色不存在,问题一定出在hasRole函数上。我尝试先编写一个函数来检查角色,但还是失败了

问题在于,您正在向get()传递字符串,而不是路径。请注意,上面说的论点是一个错误。根据路径的文档:

路径可以通过两种方式创建。第一种是“原始”形式 以正斜杠/开头:

/路径/到/资源

第二种方法是使用path()函数从字符串转换:

路径(“路径/到/资源”)

如果要将字符串组合成路径(因为在其中的某个位置有一个空格),则必须使用path()函数。或者,可以使用该函数插入包含空格的值。使用路径():

请注意,路径的字符串形式缺少前导斜杠,所有变量都需要通过串联添加


或者,您可以从“Seva Development”中删除空格,只使用路径的原始形式。

问题在于您将字符串传递给get(),而不是路径。请注意,上面说的论点是一个错误。根据路径的文档:

路径可以通过两种方式创建。第一种是“原始”形式 以正斜杠/开头:

/路径/到/资源

第二种方法是使用path()函数从字符串转换:

路径(“路径/到/资源”)

如果要将字符串组合成路径(因为在其中的某个位置有一个空格),则必须使用path()函数。或者,可以使用该函数插入包含空格的值。使用路径():

请注意,路径的字符串形式缺少前导斜杠,所有变量都需要通过串联添加


或者,您可以从“Seva Development”中删除空格,只使用路径的原始形式。

请编辑问题,以包含get()引用的文档内容。规则是否都独立运行?换言之,如果你只有左边的规则还是只有右边的规则,它能工作吗?@AndréKool左边的规则(检查公司)独立运作。没有正确的规则(检查角色)。这就是我质疑角色查找的原因。请编辑该问题以包含get()引用的文档的内容。规则是否都独立运行?换言之,如果你只有左边的规则还是只有右边的规则,它能工作吗?@AndréKool左边的规则(检查公司)独立运作。没有正确的规则(检查角色)。这就是我质疑角色查找的原因。即使使用绑定或使用路径公式,我也无法让它在空间中工作,但在删除空间后,它似乎在模拟器上工作,这是一个巨大的进步,但当我从本地计算机上运行它时,它拒绝许可。。。有什么我遗漏的吗?它已经30分钟了。自从模拟器说它工作了,我试着重新加载页面,等等。这个答案帮了我很多,救命!不知道为什么我以前找不到路径函数。谢谢@tempSeva“在我的本地机器上运行”是什么意思?当我在角度环境下运行ng serve时。似乎问题不在于“本地机器”,而在于左侧(检查用户公司)不再工作。例如,如果您有一个角色,它将提供访问权限,但如果您是公司的一部分,它将不再提供访问权限。我不知道为什么…如果我删除了角色部分,如果你是公司的一员,它将提供访问权限。如果我没有,或者如果我只有关于角色的部分,如果你有这个角色,它会提供访问权限,但如果你只是公司的一部分,它就不会提供访问权限。我无法让它使用空间,即使是绑定或使用路径公式,但在移除空间后,它似乎正在模拟器上工作,这是一个巨大的进步,但当我在本地机器上运行它时,会拒绝许可。。。有什么我遗漏的吗?它已经30分钟了。自从模拟器说它工作了,我试着重新加载页面,等等。这个答案帮了我很多,救命!不知道为什么我以前找不到路径函数。谢谢@tempSeva“在我的本地机器上运行”是什么意思?当我在角度环境下运行ng serve时。似乎问题不在于“本地机器”,而在于左侧(检查用户公司)不再工作。例如,如果您有一个角色,
function hasRole(roles) {
    return get(path("databases/" + database + "/documents/companies/Seva Development/users/" + request.auth.uid)).data.roles.hasAny(roles);
}