1

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

4

0 回答 0