我在Firestore数据库中设置了以下简单规则。
service cloud.firestore {
match /databases/{database}/documents {
function isSignedIn() {
return request.auth != null;
}
match /organisations/{orgID}/{document=**} {
allow list, read, write: if isSignedIn() && request.auth.claims.organisation_uuid == orgID;
}
}
}
目的是使任何经过身份验证的用户都可以访问其组织中的所有文档。我希望用户能够访问的示例集合是下面显示的任务子集合
"organisations": [
"$orgID": {
"tasks": [
"taskID1": {
...
},
"taskID2": {
...
},
]
}
用户正在使用自定义JWT令牌进行身份验证,该令牌使用的服务帐户如下所示
{
"iss":"accountemail@db-name.iam.gserviceaccount.com",
"sub":"accountemail@db-name.iam.gserviceaccount.com",
"aud":"$correct-audience-string",
"iat":1532937868,
"uid":"e13e07a8-f7f2-4c7a-a02f-be729601e62e",
"exp":1532941468,
"claims":{
"organisation_uuid":"9cb3ebae-d16e-4898-a784-f0aac513fcb8"
}
}
上面的Claims部分对应于我的数据库安全规则中的request.auth.claims.organisation_uuid == orgID
规则。
在firestore Web控制台中模拟的单个文档请求工作正常,但使用如下所示的cloud_store
颤振库构建的查询
Firestore.instance
.collection('organisations')
.document(technician.organisation_uuid)
.collection('tasks')
.where("assignee_uuid", isEqualTo: technician.uuid);
导致异常com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions.
-
我无法确定规则存在的问题,因为经过身份验证的用户应该可以访问该组织下的所有文档。非常感谢任何见解。
答案 0 :(得分:0)
所以我认为问题在于自定义令牌的service cloud.firestore {
match /databases/{database}/documents {
function isSignedIn() {
return request.auth != null;
}
function isInTheCorrectOrganisation(orgID){
return get(/databases/$(database)/documents/organisations/$(orgID)/technicians/$(request.auth.uid)).data.organisation_uuid == orgID;
}
match /organisations/{orgID}/{document=**} {
allow read, write: if isSignedIn() && isInTheCorrectOrganisation(orgID);
}
}
}
部分在请求对象上不可用,我将规则更新为以下内容,并且一切都按预期工作
<<echo=FALSE,eval=T,results='asis' >>=
table %>%
#kable_styling(latex_options = c("scale_down"),
kable_styling(font_size = 7) %>%
kable_styling(position = "center") %>%
kable_styling(full_width = F) %>%
column_spec(1, width = "5em")%>%
row_spec(0,bold = T, color = "white", background = "black" )%>%
row_spec( dim(jeden)[1]: ( dim(jeden)[1]-4), bold = T, hline_after=T,
background = "lightgray" )
@
在我看来,自定义JWT令牌声明的评估方式似乎有错误,或者我对文档的理解有误,因此澄清起来非常好。