Cloud Firestore 보안 규칙에 존재했던 writeFields를 기억하십니까?

기억나세요?...나는 최근까지 그 존재를 완전히 잊어버렸다.
그가 언제 사라졌는지 내가 대체 기능에 대해 얘기할게MapDiff.

존재했던 리퀘스트.writeFields


Cloud Firestore의 보안 규칙에는 변수request.writeFields가 있었습니다.
주로 작업 규칙createupdate을 쓸 때 수정할 필드 대상을 참고할 수 있습니다.
예를 들어, 다음 문서가 있습니다.
{
  name: 'Taro',
  age: 29,
  country: 'Japan'
}
다음 데이터를 기록한 경우update참조
{
  nickName: 'tarotaro',
  age: 30
}
request.writeFields는 다음 개체를 참조할 수 있습니다.
{
  nickName: 'tarotaro',
  age: 30
}
resource.data에서는 request.resource.data에 기록된 미래의 문서 필드의 상태를 얻기 위해 request.writeFields는'무엇을 쓰고 무엇을 업데이트하는가'의 차이를 얻는 데 매우 편리하다.

하지만...


하지만 이는 2018년 10월께부터 디프리캣드로 바뀌었고, 공식 문서에서도 참고가 삭제됐다.
잠시 이렇게 사용했지만, (정확한 타이밍은 나도 모른다) 아마 2020년 3월께 리모브드에 의해 완전히 사라졌을 것이다.
근거Stack Overflow의 답변입니다.
  • Oct 4, 2018: deprecated
  • Mar 4, 2020: Map.diff() replaces writeFields functionality
  • 이런 기술이 있다.

    등장하는 맵디프 대신.

    writeFields가 사라지기 얼마 전 2020년 2월께 함수MapDiff가 등장했다. 이 함수는 MapDiff와 두 개의 맵형 변수에 따라 생성diff()형이다.
    이 발표는 발매 노트에 라디오가 있고 Firebase 블로그에도 소개됐다.
  • 노트 를 발행 하다
  • New improvements to Firestore Security Rules
  • 새로 등장한MapDiff에 따라 기존에 불가능했던 대상의 차점을 얻을 수 있다.
    map1.diff(map2) // type of `MapDiff`
    

    MapDiff가 보유한 5가지 함수

    MapDiff는 다섯 개의 함수를 가지고 있다.
  • addedKeys(): 두 맵을 비교하고 추가 필드의 키 집합
  • 을 되돌려줍니다
  • removedKeys(): 두 맵을 비교하여 삭제된 필드의 키를 되돌려줍니다
  • changedKeys(): 두 맵을 비교하고 수정된 필드 키
  • 를 되돌려줍니다.
  • affectedKeys(): 두 맵을 비교하여 영향을 받은 필드 키를 되돌려줍니다.즉, addedKeys() + removedKeys() + updatedKeys()
  • unchangeedKeys(): 두 맵을 비교하여 공통적으로 존재하는 두 필드에 수정되지 않은 키 집합
  • 을 되돌려줍니다

    쓰기 전후 차등


    request.resource.data.diff(resource.data)
    
    이렇게 하면 write 작업에서 쓰기 전후에 발생하는 diff 정보를 얻을 수 있다.
    이후 필요에 따라 어떤 차이가 생길지 이 키의 세트를 얻어 안전 규칙 구축에 도움이 된다.
    request.resource.data.diff(resource.data).addedKeys()
    request.resource.data.diff(resource.data).removedKeys()
    request.resource.data.diff(resource.data).changedKeys()
    request.resource.data.diff(resource.data).affectedKeys()
    request.resource.data.diff(resource.data).unchangedKeys()
    

    함수화


    아래와 같이 함수화해서 사용하면 기술량도 줄어들어 쉽게 기술할 수 있다.
    function dataDiff() {
      return incomingData().diff(existingData());
    }
    
    function incomingData() {
      return request.resource.data;
    }
          
    function existingData() {
      return resource.data;
    }
    
    allow create: if dataDiff().unchangedKeys() == [...].toSet();
    

    참고 자료

  • Firebase Security Rules Release Notes
  • stack over flow
  • 최후


    만약 보도가 유용하다면!참고가 됐습니다!이런 상황에서 Like를 도와줄 수 있다면 정말 기쁠 것 같아요.🙌
    향후 기술 소재의 투고가 될 동기.
    지원 대기 중🐈

    좋은 웹페이지 즐겨찾기