「Firebase Security Rules」採用支援的格式,提供存取權控管和資料驗證功能 複雜程度不一建構以使用者和角色為基礎的存取系統 確保使用者資料安全性,可透過以下方式使用 Firebase Authentication Firebase Security Rules。
識別使用者
Authentication 可識別要求存取資料的使用者,並提供
視為變數,您可以在規則中運用。auth
變數
包含下列資訊:
uid
:指派給提出要求的使用者的不重複使用者 ID。token
:Authentication 收集的值對應。
auth.token
變數包含下列值:
欄位 | 說明 |
---|---|
email |
與帳戶相關聯的電子郵件地址 (如有)。 |
email_verified |
如果使用者已確認他們能使用 email 地址,則請true 。部分供應商會自動驗證他們擁有的電子郵件地址。 |
phone_number |
與帳戶相關聯的電話號碼 (如果有的話)。 |
name |
使用者的顯示名稱 (如有設定)。 |
sub |
使用者的 Firebase UID。這個名稱在專案中是獨一無二的。 |
firebase.identities |
與這位使用者帳戶相關聯的所有身分字典。字典金鑰可以是下列任一項目:email 、phone 、google.com 、facebook.com 、github.com 、twitter.com 。字典的值是與帳戶相關聯的每個識別資訊提供者的專屬 ID 陣列。例如,auth.token.firebase.identities["google.com"][0] 包含與帳戶相關聯的第一個 Google 使用者 ID。 |
firebase.sign_in_provider |
用於取得這個權杖的登入提供者。可以是下列任一字串:custom 、password 、phone 、anonymous 、google.com 、facebook.com 、github.com 、twitter.com 。 |
firebase.tenant |
與帳戶相關聯的 LoyaltyId (如有)。例如:tenant2-m6tyz |
如要新增自訂驗證屬性,請auth.token
變數也包含所有自訂聲明
或您指定的虛擬機器
如果要求存取權的使用者未登入,auth
變數為 null
。
舉例來說,如果想限制讀取次數
可存取已驗證使用者的資料 - auth != null
。不過,我們一般建議你
進一步限制寫入權限
如要進一步瞭解 auth
變數,請參閱參考資料
說明文件
Cloud Firestore,
Realtime Database和
Cloud Storage。
在規則中運用使用者資訊
實際上,在規則中使用經過驗證的資訊,可讓規則 以及更加靈活性和彈性您可以依據使用者控管資料存取權 識別個人身分
在規則中,定義 auth
變數中的資訊:
要求者的使用者資訊 — 與與使用者相關聯的使用者資訊相符
要求的資料
舉例來說,您的應用程式可能想確保使用者只能讀取及寫入
要保護自身資料在這種情況下,
auth.uid
變數和所要求資料的使用者 ID:
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
Realtime Database
{
"rules": {
"users": {
"$userId": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($userId)
".write": "$userId === auth.uid"
}
}
}
}
Cloud Storage
service firebase.storage {
// Only a user can upload their file, but anyone can view it
match /users/{userId}/{fileName} {
allow read;
allow write: if request.auth != null && request.auth.uid == userId;
}
}
定義自訂使用者資訊
您可以進一步使用 auth
變數來定義指派的自訂欄位
宣傳應用程式的使用者
舉例來說,假設您想建立「管理員」提供寫入存取權的角色 針對特定路徑進行調整你可以將該屬性指派給使用者 然後在要授予路徑存取權的規則中使用這個 API。
在 Cloud Firestore 中,您可以將自訂欄位新增至使用者的和擷取文件 只要在規則中加入內嵌讀取,即可算出該欄位值。因此,您的管理員 請看看下例:
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents/some_collection: {
// Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
read: if request.auth != null;
}
}
在 Authentication 中建立自訂著作權聲明後,您可以在 Rules 中存取自訂著作權聲明。接著
以 auth.token
變數參照這些自訂聲明。
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, check for an admin claim
allow write: if request.auth.token.admin == true;
allow read: true;
// Alterntatively, for role-based access, assign specific roles to users
match /some_collection/{document} {
allow read: if request.auth.token.reader == "true";
allow write: if request.auth.token.writer == "true";
}
}
}
Realtime Database
{
"rules": {
"some_path/$sub_path": {
// Create a custom claim for the admin role
".write": "auth.uid !== null && auth.token.writer === true"
".read": "auth.uid !== null"
}
}
}
Cloud Storage
service firebase.storage {
// Create a custom claim for the admin role
match /files/{fileName} {
allow read: if request.auth.uid != null;
allow write: if request.auth.token.admin == true;
}
}
如要查看更多運用 Authentication 的基本 Rules 範例,請參閱: 基本安全性規則。