2014-12-22 2 views
1

Я пытаюсь составить rules.json для следующего файла Blaze YAML:Firebase Blaze Compiler дает неправильным результатам

functions: 
    - isLoggedIn(): auth.id !== null 

schema: 
    type: object 
    properties: 
     projects: 
      type: object 
      $projectId: 
       type: object 
       properties: 
        roles: 
         type: object 
         $permissionId: 
          type: object 
          $roleId: {type: boolean} 

access: 
    - location: /projects/$projectId/ 
    write: isLoggedIn() && (!next.exists() || next.hasChildren()) 

Когда я скомпилировать его с блеском я получаю JSON:

{ 
    "rules":{ 
    ".write":"false", 
    ".read":"false", 
    "projects": { 
     ".write":"false", 
     ".read":"false", 
     "$projectId": { 
     ".write":"(((false)))", 
     ".read":"false", 
     "roles": { 
      ".write":"((false))", 
      ".read":"false", 
      "$permissionId": { 
      ".write":"((false))", 
      ".read":"false", 
      "$roleId": { 
       ".write":"(((!newData.parent().parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().parent().exists()||!(((newData.parent().parent().parent().parent().isString()||newData.parent().parent().parent().parent().isNumber()||newData.parent().parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().parent().exists()||!(((newData.parent().parent().parent().isString()||newData.parent().parent().parent().isNumber()||newData.parent().parent().parent().isBoolean()))))&&(!newData.parent().parent().exists()||!(((newData.parent().parent().isString()||newData.parent().parent().isNumber()||newData.parent().parent().isBoolean()))))&&(!newData.parent().exists()||!(((newData.parent().isString()||newData.parent().isNumber()||newData.parent().isBoolean()))))&&(!newData.exists()||newData.isBoolean())&&auth.id!==null&&(!newData.parent().parent().parent().exists()||newData.parent().parent().parent().hasChildren())))", 
       ".read":"false" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

I ожидал бы, что правило $projectId.write содержит скомпилированную версию isLoggedIn() && (!next.exists() || next.hasChildren()), но вместо этого оно содержит (((false))).

Является ли это ошибкой в ​​пламени или мои правила YAML не построены правильно? Если это не правильно, где я ошибся?

ответ

0

это не ошибка, а некоторые тонкости, связанные с гнездом диких детей. «Использование wildchild не позволяет всем асцендентам быть доступными для записи». [1]

Вы можете использовать wilderchild вместо $ projectId с помощью "~ $ projectId" (обратите внимание, что при некоторых соображениях безопасности вы не сможете запретить пользователям удалять записи $ permissionId [2 ])

functions: 
    - isLoggedIn(): auth.id !== null 

schema: 
    type: object 
    properties: 
     projects: 
      type: object 
      ~$projectId: 
       type: object 
       properties: 
        roles: 
         type: object 
         $permissionId: 
          type: object 
          $roleId: {type: boolean} 

access: 
    - location: /projects/$projectId/ 
    write: isLoggedIn() && (!next.exists() || next.hasChildren()) 

[1] https://github.com/firebase/blaze_compiler#wildchild

[2] https://github.com/firebase/blaze_compiler#wilderchild

+0

я пропустил эту точку из документации. Спасибо за разъяснения. –

Смежные вопросы