Firbase-設定 Rules

好東西不解釋。

簡述

在已經知道 Firebase 基礎 後,這篇要來談談「權限機制」。

簡單來說,目前的我們都還沒有做任何「Rule」設定,代表任何人都可以對 collection & documents 做 Read & Write 的動作,這顯然是一個很大的資安問題。

因此這篇要來紀錄「怎麼設定權限」這件事。

預設的規則

打開你 Firestore 的主控台,應該會看到一個 Tab 是「規則」,點下去後該會看到這段 code:

1
2
3
4
5
6
7
8
9
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if
request.time < timestamp.date(2022, 7, 25);
}
}
}

這邊一行一行來解釋每段的意思。

1. rules_version = '2'

沒什麼,就是目前使用的版本是幾號。

2. service cloud.firestore

這個規則是給哪個 sevice 用的?這邊是 firestore 所以就填 firestore,如果是其他的 service 就會是其他的值。

3. match /databases/{database}/documents {...}

這個簡單來說就是「databases 底下的任何資料庫的 documents」都會套用 {...} 中的設定,{database} 跟萬用字元的意思差不多。

4. match /{document=**} {...}

跟上面一樣,任何{document=**} 都會套用 {...} 中的設定。

5. allow read, write: if ...

這邊就是正式的規則了,可以 read 和 write,然後在 timestamp.date(2022, 7, 25) 這個時間點以前。

所以這一整段的規則就是:

在 2022/07/25 之前,任何人對 firestore 底下的任何 database、任何 documents,都具有 read 和 write 權限(換言之就是大放送)。

設定規則

先說一下基本的權限有:

  • write(直接包含 create、delete、update 的意思)
  • create
  • delete
  • update

接著來看 code 解釋:

1
2
3
4
5
6
7
8
9
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /recipes/{document=**} {
allow create: if request.auth != null
allow read, delete: if request.auth.uid == resource.data.uid
}
}
}

1. match /recipes/{document=**}

這邊要設定的規則是給 recipes 這個 collection 用的,所以加上指定的路徑。

2. allow create: if request.auth != null

條件一:「使用者必須登入才可以 create」

簡單來說 request 底下有一個 auth 物件,這個物件就是我們每次發 request 時 Firebase 要拿來驗證的「JWT」,如果這個 JWT 不合法或是不存在,那就會驗證失敗,反之亦然。

所以這邊在做的就是確人 auth 是否有值?只有在有值的情況下才允許他 create。

3. allow read, delete: if request.auth.uid == resource.data.uid

條件二:「使用者只能 read 和 delete 自己的資料」

剛有說過 auth 就代表 JWT,所以可以用 .uid 的方式來辨別身份。接著 resource 的部分其實就是指存資料庫裡的資料。

一般來說在存資料時我們會額外添加一個 uid 來表示這個資料是誰的?所以在這邊就可以利用它來判斷這筆資料是不是 xxx 的?唯有符合條件時才允許他 read 和 delete。

以上就是基本的權限設置,一旦沒有遵循這個規則,那就沒有辦法做 CRUD 的動作,Firebase 會直接擋下來。

總之這是蠻好用的功能,我覺得很值得學習。

Firebase-Authentication MUI 筆記
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×