使用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收到“权限不足”错误。