user 콜렉션 내 관리자로 지정할 유저의 document에 아래 필드 추가한다.
(auth에는 지정 못함)
role : admin
혹은 admin : true
(boolean)
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()
데이터 유효셩 검사하는 규칙을 만들어 보자.
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.제목.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