Vuexfire / Firestore规则:对集合中某些元素进行基于角色的访问

时间:2019-02-06 15:32:40

标签: google-cloud-firestore vuexfire

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

0 个答案:

没有答案