iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 10
1

資料權限

可設定的rules 有四種 type:

  1. .read 針對讀的權限,淺層規則覆蓋深層
  2. .write 針對寫的權限,淺層規則覆蓋深層
  3. .validate 資料驗證,不會影響子節點
  4. .indexOn 節點的索引設定,輔助排序與過濾功能

有這幾種現有的變數可以使用

  1. now 主要用來取得目前時間,格式為從1970-1-1到目前時間點的millisecond表示
    驗證:創建的資料時間必須小於當今時間 .validate: newData.val() {小於} now
  2. root 指向資料庫的最頂層,用來取得其他節點資料相當方便
    查看user欄位中的特定id是否存在 root.child('/users/'+$uid).exists()
  3. newData 套用於write和valite上,取得Request挾帶的資料物件
    驗證要新增的age欄位是否大於10 newData.child('age').val()>10
  4. data 相對應於newData,data表示原本存在於資料庫中的現有資料如果要讀取,檢查資料是否為公開 ".read": "data.child('public').val() == true"
  5. $variable 用來表示動態的子節點路徑,相當於wildcard
  6. auth 取得通過驗證的使用者資料
    檢查資料的uid和驗證者的uid是否一致 data.child('uid').val()==auth.uid

讀取:

{
  "rules": {
     "users": {
        // 只能讀取18歲以上
        ".read": "data.child('age').val() >= 18",
        "name": {
          // 不加也可以, 因為default就是false
          ".read": false
        }
     }
  }
}

寫入:

{
  "rules": {
    ".write": true,
    "users": {
      // 要新增的資料必須包含這兩個欄位
      ".validate": "newData.hasChildren(['name', 'age'])",
      "name": {
        // 名稱必須包含在"/team_frontend/"的子節點
        ".validate": "root.child('team_frontend/' + newData.val()).exists()"
      },
      "age": {
        // 必須是數字且值在1到99之間
        ".validate": "newData.isNumber() &&
                      newData.val() >= 1 &&
                      newData.val() <= 99"
      }
    }
  }
}

排序, 過濾資料

排序:

  1. orderByChild(特定欄位):針對特定的子欄位
  2. orderByKey(無參數):依據資料的Key(如果是用push()新增的話等同於創建順序)
  3. orderByValue(無參數):排列順序等同orderByChild(“欄位”)

過濾:

  1. limitStartAt(數字) 取資料序列前幾位
  2. limitToLast(數字) 取資料序列前幾位
  3. startAt(值) 大於等於值
  4. endAt(值) 小於等於值
  5. equalTo(值) 等於值

這邊可以印出我們users所有的資料

DB_USERS.orderByKey().once('value').then(snapshot => {
  snapshot.forEach(childSnapshot => {
    console.log(childSnapshot.val());
  });
})

如果資料是用push()存入, 就可以用orderByKey()取出, orderByChild() 可傳入子節點的參數, 然後用過濾的方式將資料取出, 舉例:

firebase.database().ref('team_frontend/' + name).orderByChild("age").startAt(20).once('value').then(function(snapshot){
  snapshot.forEach(function(childSnapshot) {
    console.log(childSnapshot.val());
    //在team_frontend裡按照年齡排序, 並且年齡大於20以上的人
  });
})

參考資料 Firebase Database Security Rules API

參考資料 YJ BLOG


上一篇
Firebase intro. (3/4
下一篇
VueFire intro. (1/2
系列文
GAME30天30

1 則留言

我要留言

立即登入留言