我在使用 Firestore 规则和 Vuexfire 实施基于角色的访问系统时遇到问题。
我的目标是能够根据用户角色将我的应用程序中的列表绑定到 Firestore 集合,其中只有部分元素可见/可编辑。
尝试使用我当前的结构进行此操作时,在绑定集合时授予对集合中单个元素的读/写访问权限会返回“权限不足”错误,并且没有检索到任何内容。
我试图实现的行为是:
- 在我的应用程序中访问列表时,用户只会看到他的角色集合授予他访问权限的元素。
- 只有当集合为空或用户对集合中的任何元素都没有相关角色时,才会出现空列表。
当前的结构可以说明如下:
hotels/
hotelA
name: "hotel-a"
rooms/
roomA
roomB
hotelB
name: "hotel-b"
rooms/
users/
adminA
roles/
hotelA
role: "admin"
使用以下规则:
service cloud.firestore {
match /databases/{database}/documents {
allow read: if request.auth != null;
match /hotels/{hotel} {
function isSignedIn() {
return request.auth != null;
}
function getRole(rsc) {
return get(/databases/$(database)/documents/users/$(request.auth.uid)/roles/$(rsc.id)).data.role;
}
function isOneOfRoles(rsc, array) {
return isSignedIn() && (getRole(rsc) in array);
}
allow read, write: if isOneOfRoles(resource, ["admin"]);
}
}
}
然后我使用 Vuexfire 将酒店列表绑定到酒店集合,如下所示:
const setListHotelRefFromId = (context) => {
var db = firebase.firestore()
var listHotelRef = db.collection('hotels')
context.dispatch('setListHotelRef', { ref: listHotelRef })
}
const setListHotelRef = firebaseAction(({ bindFirebaseRef, unbindFirebaseRef, commit }, { ref }) => {
commit(types.SET_LOADING, true)
bindFirebaseRef('list.hotel', ref).then(() => {
commit(types.SET_LOADING, false)
})
})
在上述环境中,假设我以用户 ID 为“AdminA”的用户身份登录,并访问酒店列表。我希望看到一个包含单个条目“hotelA”的列表,但却从 Firestore 收到“权限不足”错误。