Flutter

[Flutter] Firestore 데이터 입출력시 규칙 정하는 법

hminor 2023. 8. 16. 18:54

Firestore 데이터 입출력시 규칙 정하는 법

  • 데이터 추가 시 의도한 형식에 맞게 추가하고자 할 경우
    • if 조건문을 통해 제어하는 방법 ( 위변조가 가능하기에 근본적인 해결책이 아님)
    • Firestore Console → Firestore Database → 규칙
      • 우선 형식은 아래와 같다
        • 경로: 어떤 게시물(Collection or Document)에 규칙을 정할 것인지
        rules_version = '2';
        
        service cloud.firestore {
          match /databases/{database}/documents {
            match 경로 {
            조건
            }
          }
        }
        
        • ex) product 컬렉션에 조건을 주겠다고 하면
          • {docid} ⇒ product에 있는 모든 문서에 대한 조건을 주겠다는 의미
        • 규칙
          • allow read ⇒ 읽기 규칙 설정 ⇒ 어떤 사람이 읽을 수 있는지에 대한 규칙
          • allow create ⇒ 생성 규칙 설정 ⇒ 어떤 사람이 생성할 수 있는지에 대한 규칙
          • allow update ⇒ 수정 규칙 설정 ⇒ 어떤 사람이 수정할 수 있는지에 대한 규칙
          • allow delete ⇒ 삭제 규칙 설정 ⇒ 어떤 사람이 삭제할 수 있는지에 대한 규칙
        • 아래는 로그인 한 사람만 /product의 모든 문서를 읽을 수 있도록 하기 위한 코드
          • request ⇒ 요청한 사람의 정보
          • request.auth ⇒ 요청한 사람의 로그인 정보
        rules_version = '2';
        
        service cloud.firestore {
          match /databases/{database}/documents {
            match /product/{docid} {
            	allow read : if request.auth != null;
            }
          }
        }
        
        • 위와 같이 작성했는데 계속 데이터가 조회가 되고
          • permission Error가 발생하지 않는다면 로그아웃 함수를 한번 처리하고 다시 시도해보면 잘 작동하는 것을 확인할 수 있다.
          • 본인도 안되서 계속 코드 확인했었음;; 핳
      • 이제 내가 발행한 문서만 update 가능하도록 하는 규칙을 작성한다면
        • 우선 게시글을 작성시 작성자의 uid도 함께 기입해주고
        • 게시글 작성자의 uid와 현재 로그인 되어 있는 유저의 uid가 같은 경우에 대한 조건 추가를 위해 아래와 같이 코드 작성
        • response.data ⇒ 현재 수정하려는 게시물의 정보가 담겨 있음
        • .who는 따로 해당 key값으로 넣은 게시글 작성자의 uid를 의미
         rules_version = '2';
        
        service cloud.firestore {
          match /databases/{database}/documents {
            match /product/{docid} {
            	allow read : if request.auth != null;
        			allow update : if request.auth.uid == response.data.who
            }
          }
        }
        
      • 이러한 규칙은 아래의 경로에서 확인할 수 있다.
      • 그리고 많이 사용하는 코드로
        • 생성시 의도한 데이터 타입에 맞는 데이터, 값 입력 검사 등 다양하게 조건을 걸어 조사할 수 있다.
        • 만약 현재 name에 대한 값이 1글자 이상 들어가야 한다면
        allow create : if request.resource.data.name.size() > 0;
        
        • 정규식을 사용해 조사하고 싶다면
          • matches() 로 조사할 수 있다.
        allow create : if request.resource.data.name.matches()
        
  • 그리고 모든 컬렉션과 문서를 찾고자 한다면
    • /{docid=**} 로 하위 컬렉션 까지 적용한다고 작성할 수 있다.
    • 보통은 컬렉션 마다 적용하는 것이 좋다.
    • 또한 코드가 너무 길어진다면 하위에서 함수로 작성 후 적용할 수도 있다.
    rules_version = '2';
    
    service cloud.firestore {
      match /databases/{database}/documents {
        match /{docid=**} {
        	
        }
      }
    }