首页 > 解决方案 > Firebase FireStore 复杂的安全规则

问题描述

有一个应用程序,其中我们有多个communities用户,并且具有向其发送消息的角色write。每个社区都有自己的用户({communityId}/meta_users/{uid})我已经编写了一个访问用户角色的函数,我试图浏览文档但无法提供任何帮助。我模拟我检查userRoleLevel即使用户分配了角色('admin')也不允许阅读。请帮我纠正它。我已经粘贴了下面的规则片段。让我知道是否需要更多信息

function userRoleLevel(community){
  return exists(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level)
  && get(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level).data.role;
}

service cloud.firestore {
  match /databases/{database}/documents {
    // All read is allowed for now.
    match /{document=**} {
      allow read;
    }


    match /communities/{community} {
      allow write: if owner();
      match /{category}/{message}{
       allow write: if loggedIn() 
       && (userRoleLevel(community) in ['owner', 'admin', 'writer']);
      }

标签: firebasegoogle-cloud-firestore

解决方案


您有userRoleLevel()返回布尔值而不是包含角色的字符串的函数。userRoleLevel(community) in ['owner', 'admin', 'writer']除非您执行以下操作,否则您将无法使用。

function userRoleLevel(community){
  if( exists(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level) ) {
    return get(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level).data.role;
  } else {
    return false; // return something that won't match your roles
  }
}

推荐阅读