获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Regras básicas de segurança

As regras de segurança do Firebase permitem controlar o acesso aos seus dados armazenados. A sintaxe de regras flexíveis significa que você pode criar regras que correspondam a qualquer coisa, desde todas as gravações em todo o banco de dados até operações em um documento específico.

Este guia descreve alguns dos casos de uso mais básicos que você pode querer implementar ao configurar seu aplicativo e proteger seus dados. No entanto, antes de começar a escrever regras, você pode querer saber mais sobre o idioma em que elas foram escritas e seu comportamento .

Para acessar e atualizar suas regras, siga as etapas descritas em Gerenciar e implantar regras de segurança do Firebase .

Regras padrão: modo bloqueado

Ao criar um banco de dados ou instância de armazenamento no Firebase console, você escolhe se as regras de segurança do Firebase restringem o acesso aos seus dados ( modo bloqueado ) ou permitem o acesso de qualquer pessoa ( modo de teste ). No Cloud Firestore e no Realtime Database, as regras padrão para o modo bloqueado negam acesso a todos os usuários. No Cloud Storage, apenas usuários autenticados podem acessar os buckets de armazenamento.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Banco de dados em tempo real

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

Armazenamento na núvem

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Regras do ambiente de desenvolvimento

Enquanto estiver trabalhando em seu aplicativo, talvez você queira um acesso relativamente aberto ou irrestrito aos seus dados. Apenas certifique-se de atualizar suas regras antes de implantar seu aplicativo em produção. Lembre-se também de que, se você implantar seu aplicativo, ele ficará publicamente acessível, mesmo que você não o tenha iniciado .

Lembre-se de que o Firebase permite que os clientes acessem seus dados diretamente, e as regras de segurança do Firebase são a única proteção que bloqueia o acesso de usuários mal-intencionados. Definir regras separadamente da lógica do produto tem várias vantagens: os clientes não são responsáveis ​​por impor a segurança, as implementações de bugs não comprometerão seus dados e, o mais importante, você não depende de um servidor intermediário para proteger os dados do mundo.

Todos os usuários autenticados

Embora não recomendemos deixar seus dados acessíveis a qualquer usuário conectado, pode ser útil definir o acesso a qualquer usuário autenticado enquanto você desenvolve seu aplicativo.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Banco de dados em tempo real

{
  "rules": {
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  }
}

Armazenamento na núvem

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Regras prontas para produção

Ao se preparar para implantar seu aplicativo, certifique-se de que seus dados estejam protegidos e que o acesso seja concedido adequadamente aos seus usuários. Aproveite a autenticação para configurar o acesso baseado no usuário e leia diretamente do seu banco de dados para configurar o acesso baseado em dados.

Considere escrever regras à medida que estrutura seus dados, pois a maneira como você configura suas regras afeta como você restringe o acesso a dados em diferentes caminhos.

Acesso exclusivo do proprietário do conteúdo

Essas regras restringem o acesso apenas ao proprietário autenticado do conteúdo. Os dados só podem ser lidos e gravados por um usuário, e o caminho de dados contém o ID do usuário.

Quando esta regra funciona: esta regra funciona bem se os dados forem isolados pelo usuário — se o único usuário que precisa acessar os dados for o mesmo usuário que os criou.

Quando esta regra não funciona: este conjunto de regras não funciona quando vários usuários precisam gravar ou ler os mesmos dados — os usuários substituirão os dados ou não poderão acessar os dados que criaram.

Para configurar esta regra: Crie uma regra que confirme que o usuário que está solicitando acesso para ler ou gravar dados é o usuário que possui esses dados.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{userId}/{documents=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId
    }
  }
}

Banco de dados em tempo real

{
  "rules": {
    "some_path": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "auth !== null && auth.uid === $uid",
        ".write": "auth !== null && auth.uid === $uid"
      }
    }
  }
}

Armazenamento na núvem

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Acesso misto público e privado

Essa regra permite que qualquer pessoa leia um conjunto de dados, mas restringe a capacidade de criar ou modificar dados em um determinado caminho apenas para o proprietário do conteúdo autenticado.

Quando esta regra funciona: esta regra funciona bem para aplicativos que exigem elementos de leitura pública, mas precisam restringir o acesso de edição aos proprietários desses elementos. Por exemplo, um aplicativo de bate-papo ou blog.

Quando esta regra não funciona: como a regra somente proprietário do conteúdo, esse conjunto de regras não funciona quando vários usuários precisam editar os mesmos dados. Os usuários acabarão substituindo os dados uns dos outros.

Para configurar esta regra: Crie uma regra que ative o acesso de leitura para todos os usuários (ou todos os usuários autenticados) e confirme que os dados de gravação do usuário são o proprietário.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

Banco de dados em tempo real

{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data

  "rules": {
    "some_path": {
      "$uid": {
        ".read": true,
        // or ".read": "auth.uid !== null" for only authenticated users
        ".write": "auth.uid === $uid"
      }
    }
  }
}

Armazenamento na núvem

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

Acesso baseado em atributo e baseado em função

Para que essas regras funcionem, você deve definir e atribuir atributos aos usuários em seus dados. As regras de segurança do Firebase verificam a solicitação em relação aos dados do seu banco de dados ou metadados do arquivo para confirmar ou negar o acesso.

Quando esta regra funciona: se você estiver atribuindo uma função a usuários, esta regra facilita a limitação do acesso com base em funções ou grupos específicos de usuários. Por exemplo, se você estiver armazenando notas, poderá atribuir diferentes níveis de acesso ao grupo "alunos" (leia apenas o conteúdo), ao grupo "professores" (ler e escrever em sua disciplina) e ao grupo "diretores" (leia Todo o conteúdo).

Quando esta regra não funciona: no Realtime Database e no Cloud Storage, suas regras não podem aproveitar o método get() que as regras do Cloud Firestore podem incorporar. Conseqüentemente, você precisa estruturar seu banco de dados ou metadados de arquivo para refletir os atributos que está usando em suas regras.

Para configurar esta regra: no Cloud Firestore, inclua um campo nos documentos dos usuários que você possa ler e estruture sua regra para ler esse campo e conceder acesso condicionalmente. No Realtime Database, crie um caminho de dados que defina os usuários do seu aplicativo e conceda a eles uma função em um nó filho.

Você também pode configurar declarações personalizadas em Autenticação e, em seguida, recuperar essas informações da variável auth.token em qualquer regra de segurança do Firebase.

Atributos e funções definidos por dados

Essas regras funcionam apenas no Cloud Firestore e no Realtime Database.

Cloud Firestore

Lembre-se de que sempre que suas regras incluirem uma leitura, como as regras abaixo, você será cobrado por uma operação de leitura no Cloud Firestore.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, Check a boolean `admin` attribute
    allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
   }
  }
}

Banco de dados em tempo real

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
        ".read": true
      }
    }
  }
}

Atributos e funções de reivindicação personalizada

Para implementar essas regras, configure declarações personalizadas no Firebase Authentication e aproveite as declarações em suas regras.

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";
   }
  }
}

Banco de dados em tempo real

{
  "rules": {
    "some_path": {
      "$uid": {
        // Create a custom claim for each role or group
        // you want to leverage
        ".write": "auth.uid !== null && auth.token.writer === true",
        ".read": "auth.uid !== null && auth.token.reader === true"
      }
    }
  }
}

Armazenamento na núvem

service firebase.storage {
  // Allow reads if the group ID in your token matches the file metadata's `owner` property
  // Allow writes if the group ID is in the user's custom token
  match /files/{groupId}/{fileName} {
    allow read: if resource.metadata.owner == request.auth.token.groupId;
    allow write: if request.auth.token.groupId == groupId;
  }
}

Atributos de locação

Para implementar essas regras, configure a multilocação no Google Cloud Identity Platform (GCIP) e aproveite o locatário em suas regras. Os exemplos a seguir permitem gravações de um usuário em um locatário específico, por exemplo tenant2-m6tyz

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For tenant-based access control, check for a tenantID
    allow write: if request.auth.token.firebase.tenant == 'tenant2-m6tyz';
    allow read: true;
  }
}

Banco de dados em tempo real

{
  "rules": {
    "some_path": {
      "$uid": {
        // Only allow reads and writes if user belongs to a specific tenant
        ".write": "auth.uid !== null && auth.token.firebase.tenant === 'tenant2-m6tyz'",
        ".read": "auth.uid !== null
      }
    }
  }
}

Armazenamento na núvem

service firebase.storage {
  // Only allow reads and writes if user belongs to a specific tenant
  match /files/{tenantId}/{fileName} {
    allow read: if request.auth != null;
    allow write: if request.auth.token.firebase.tenant == tenantId;
  }
}