다른 사용자가 읽기 / 업데이트 / 쓰기 할 수 있도록 Firebase에서 권한을 관리하는 방법은 무엇입니까?

J4N

Firestore 데이터베이스가 있고 이제 새 컬렉션을 추가해야합니다.

이 컬렉션의 각 항목에는 다음이 포함되어야합니다.

  1. 소유자 (필드 관리자)는 어떤 사용자 ID입니까?
  2. 이 요소를 편집 할 수있는 사용자 ID (필드 작성자)
  3. 읽기만 허용 된 사용자 ID (필드 리더).

나는 현재 첫 단계에 불과하며 이미 어려움을 겪고 있습니다.

내 컬렉션 (/ trips /)을 쿼리하고 액세스 할 수있는 항목 만 가져올 수 있기를 바랐지만 오류가 발생합니다.

FirebaseError: Missing or insufficient permissions.

다음은 내 규칙 파일입니다.

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
    match /users/{userId} {
        allow read, update, delete: if request.auth != null && request.auth.uid == userId;
        allow create: if request.auth != null;
    }
    match /trips/{trip} {
        allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.admin;
        allow create: if request.auth != null;
    }
  }
}

그래서 내 질문 :

  1. 이것이 여러 사람이 액세스해야하는 리소스를 관리하는 올바른 방법입니까 (즉, 여러 사용자가 있으므로 경로에 userId를 가질 수 없음)
  2. 내가 볼 수있는 문서 목록 만 쿼리하려면 어떻게해야합니까?

당신의 도움을 주셔서 대단히 감사합니다

르노 타르 넥

문서 에서 읽을 수 있듯이 "모든 일치 문 컬렉션이 아닌 문서를 가리켜 야합니다 ".

service cloud.firestore {
  match /databases/{database}/documents {

    match /trips {
       // ....
    }
  }
}

문서를 가리 키지 않습니다. 다음과 같이 와일드 카드를 사용하여 지정된 경로에있는 문서를 가리켜 야합니다.

service cloud.firestore {
  match /databases/{database}/documents {

    match /trips/{trip} {
       // ....
    }
  }
}

따라서 다음은 요구 사항을 올바르게 구현해야합니다.

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    match /trips/{trip} {
        allow read: if request.auth != null && 
        (request.auth.uid == resource.data.admin 
         || request.auth.uid == resource.data.writer
         || request.auth.uid == resource.data.reader
        );
        allow update: if request.auth != null && 
        (request.auth.uid == resource.data.admin 
         || request.auth.uid == resource.data.writer
        );
        allow create: if request.auth != null;
    }
  }
}

그런 다음 두 가지 질문에 대해

이것이 여러 사람이 액세스해야하는 리소스를 관리하는 올바른 방법입니까 (즉, userId여러 사용자가 있으므로 경로에있을 수 없음)

관리자, 작성자 및 독자가 각 문서에 대해 특정한 경우 이것이 올바른 방법입니다. 이러한 역할이 더 글로벌 한 경우 (예 : 동일한 사용자가 모든 유럽 여행을 편집 할 수 있음) 사용자 지정 클레임 과 함께 역할 기반 접근 방식을 사용할 수 있습니다 .

내가 볼 수있는 문서 목록 만 쿼리하려면 어떻게해야합니까?

것이 중요합니다 규칙은 필터하지 않습니다 . 따라서 문서를 가져 오기위한 쿼리는 규칙과 일치해야합니다. 특정 경우에 세 개의 값을 포함하는 Array 유형의 추가 필드를 가질 수 있습니다. 관리자, 작성자 및 독자의 uid 및 array-contains연산자를 사용합니다 . 다음과 같은 것 :

const user = firebase.auth().currentUser;
const query = db.collection("trips").where("authorizedReaders", "array-contains", user.uid);

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관