Admin 권한 & Data validation

Jian·2022년 9월 30일
0

Firebase

목록 보기
2/9

관리자 여부 표시하기


user 콜렉션 내 관리자로 지정할 유저의 document에 아래 필드 추가한다.
(auth에는 지정 못함)

role : admin 혹은 admin : true (boolean)

Firestore 규칙 수정


product 콜렉션의 게시물 수정/삭제 시, 본인 게시물일 때 허용하는 규칙에 admin일 때도 허용하기
다른 콜렉션(user) 도큐먼트 가져와서 조건문 걸어줘야 한다.

match /product/{docid} {
  allow read : if true;
  allow create : if request.auth != null;
  allow update : if request.auth.uid == resource.data.uid 
  || get(/databases/$(database)/documents/user/$(request.auth.uid)).data.role == 'admin';
}

// 지금요청하는유저의role == 'admin'일 때 허용

Firestore 문법 정리


get(/databases/$(database)/documents/user/$(request.auth.uid))

$() : firebase에서 변수에 사용

  • $(database) : 내 계정 내 여러 프로젝트 있는데, 그 중에서 현재 조작 중인 project를 뜻한다.
  • $(request.auth.uid) : 해당 요청을 보낸 유저의 uid

get : 다른 도큐먼트의 특정 값 가져온다

  • get().data : document 안에 있던 데이터가 전부 object 형식으로 반환됨

exist : 해당 도큐먼트 존재여부 반환한다

규칙에 함수 사용하여 조건문을 축약해보자

Firestore 규칙에 아래와 같이 함수도 사용할 수 있다.

// 1. admin여부 판별 함수 생성하기
function isAdmin(){
	return get(/databases/$(database)/documents/user/$(request.auth.uid))
} 

match /product/{docid} {
  allow read : if true;
  allow create : if request.auth != null;
// 2. 함수 사용하기
  
  allow update : if request.auth.uid == resource.data.uid  || isAdmin()

Data Validation 규칙 만들기

데이터 유효셩 검사하는 규칙을 만들어 보자.

유저가 DB write시 필드 임의 생성 방지 가능

match /product/{docid} {
  allow read : if true;
  allow create : if request.auth != null
  && request.resource.data.keys().hasOnly(['title', 'content', 'price']);

// product 콜렉션에 도큐먼트 생성 시 title', 'content', 'price' 키 값을 가진 object만 허용한다.
  • request.resource.data : 유저가 요청한 데이터를 의미한다
  • keys().hasOnly(['key1', 'key2', 'key3']) : 이 데이터에 있는 필드값을 검사할 수 있다.

밸류의 타입, 밸류 사이즈 설정 가능

  • request.resource.data.제목.size()
    제목필드에 입력한 글자수를 뜻합니다.

  • request.resource.data.제목 is string
    제목필드에 입력한게 글자인지 검사

match /product/{docid} {
  allow read : if true;
  allow create : if request.auth != null
    && request.resource.data.title.size() > 0 // 빈 칸 입력 허용 X
    && request.resource.data.title is string // 문자일 때만 허용 O
}

(프론트에도 가격 Number으로 변환해두면 좋다)

c.f

  • Firestore에서 Field명 규칙 설정 시 영문으로만 가능하다.
  • VScode에서 파일 내 특정 문자 일괄변경 : cmd + shift + H
profile
개발 블로그

0개의 댓글