好東西不解釋。
簡述
在已經知道 Firebase 基礎 後,這篇要來談談「權限機制」。
簡單來說,目前的我們都還沒有做任何「Rule」設定,代表任何人都可以對 collection & documents 做 Read & Write 的動作,這顯然是一個很大的資安問題。
因此這篇要來紀錄「怎麼設定權限」這件事。
預設的規則
打開你 Firestore 的主控台,應該會看到一個 Tab 是「規則」,點下去後該會看到這段 code:
1 | rules_version = '2'; |
這邊一行一行來解釋每段的意思。
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 | rules_version = '2'; |
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 會直接擋下來。
總之這是蠻好用的功能,我覺得很值得學習。