Menu Docs
Página inicial do Docs
/ /
Serviços Atlas App
/

Permissões baseadas em role

Nesta página

  • Visão geral
  • O que são permissões?
  • Permissões de nível de documento
  • Permissões de nível de campo
  • Fluxograma de permissões de leitura
  • Fluxograma de permissões de gravação
  • Funções
  • Como o App Services Atribui Funções
  • Sem Sincronização de Dispositivos
  • Com Sincronização de Dispositivos
  • Aplicar Expressões Quando
  • Filtros do documento
  • Ordem de Função
  • Compatibilidade de sincronização
  • Definir Funções e Permissões

Você protege os dados do seu aplicativo definindo funções que são automaticamente atribuídas às solicitações de entrada de usuários e às sessões de Sincronização de Dispositivos. Cada função tem permissões de acesso a dados refinadas e condições dinâmicas que determinam quando a função se aplica.

Para obter exemplos de como você pode configurar permissões para cenários comuns com o Device Sync, consulte o Guia de permissões do Device Sync.

Uma permissão é um status que o Atlas App Services atribui a usuários individuais para controlar o que eles podem ou não fazer com os dados do seu aplicativo. Os Serviços de Aplicativos usam permissões em nível de documento e em nível de campo:

  • As permissões no nível do documento controlam se um usuário pode inserir, excluir, modificar e pesquisar um documento específico em uma coleção do MongoDB.

  • As permissões em nível de campo controlam se um usuário pode ler ou gravar os dados em campos específicos de um documento.

As permissões em nível de documento de uma role determinam quais ações que afetam todo o documento podem ser executadas. Essas permissões sempre se aplicam a todo o documento, independentemente do conteúdo. Uma função pode ter as seguintes permissões em nível de documento:

  • Inserir: você pode inserir novos documentos.

  • Excluir: você pode excluir documentos existentes.

  • Pesquisar: você pode pesquisar o documento usando o Atlas Search.

As permissões em nível de campo de uma função determinam se um usuário pode ler ou escrever campos dentro do documento. Essas permissões afetam somente o campo ao qual se aplicam, de modo que um usuário pode ter acesso de leitura ou escrita a apenas um subconjunto de todo o documento.

Você pode definir permissões de nível de campo para campos específicos e permissões padrão de leitura/escrita para quaisquer campos adicionais que você não defina explicitamente.

O diagrama a seguir mostra como o App Services determina se um usuário pode ler determinado documento:

Fluxograma de permissões de leitura
clique para ampliar

O diagrama a seguir mostra como o App Services determina se um usuário pode escrever determinado documento:

Fluxograma de permissões de gravação
clique para ampliar

Uma role é um conjunto nomeado de permissões que um usuário pode ter para documentos em uma collection do MongoDB. Uma role tem uma expressão "apply when" que determina se os App Services devem assign a role a um user. As funções também têm um conjunto de permissões em nível de documento e campo que um usuário tem quando recebe a função.

O App Services só confirma as operações que um usuário está autorizado a fazer com base na função que lhe foi atribuída. Se uma função não tiver permissão para ler um documento ou alguns de seus campos, o App Services omitirá o documento ou os campos dos resultados.

Exemplo

Considere uma coleção chamada employees, na qual cada funcionário tem seu próprio documento com todos os dados de emprego. Esta coleção pode ter duas funções: Funcionário e Gerente. Não estamos usando o Device Sync, portanto, o App Services seleciona uma função por documento.

  • Se um usuário solicitar seu próprio documento, sua função será Funcionário. Um funcionário pode ler e gravar seus próprios dados, mas não pode criar ou excluir seus próprios documentos.

  • Se um usuário solicitar um documento para alguém cujo nome esteja listado nas matrizes manages do usuário, sua função será Gerente. Um gerente pode ler e escrever os dados de seus subordinados diretos e criar e excluir seus documentos.

  • Se um usuário não for nem um Funcionário nem um Gerente de um determinado documento, ele não terá nenhuma função e não poderá ler, gravar ou pesquisar esse documento.

{
"name": "Manager",
"apply_when": { "email": "%%user.custom_data.manages" },
"insert": true,
"delete": true,
"read": true,
"write": true,
"search": true,
"fields": {},
"additional_fields": {
"read": true,
"write": true
}
}
{
"name": "Employee",
"apply_when": { "email": "%%user.data.email" },
"insert": false,
"delete": false,
"read": true,
"write": true,
"search": true,
"fields": {},
"additional_fields": {
"read": true,
"write": true
}
}
{
"_id": ObjectId(...),
"employeeId": "0528",
"name": "Phylis Lapin",
"team": "sales",
"email": "phylis.lapin@dundermifflin.com",
"manages": []
}
{
"_id": ObjectId(...),
"employeeId": "0713",
"name": "Stanley Hudson",
"team": "sales",
"email": "stanley.hudson@dundermifflin.com",
"manages": []
}
{
"_id": ObjectId(...),
"employeeId": "0865",
"name": "Andy Bernard",
"team": "sales",
"email": "andy.bernard@dundermifflin.com",
"manages": [
"phylis.lapin@dundermifflin.com",
"stanley.hudson@dundermifflin.com"
]
}

O App Services atribui funções em momentos diferentes, dependendo se você está usando a Device Sync (Modo Flexível) ou não.

Ao usar o Device Sync, o App Services atribui funções no início de uma sessão de sincronização para cada coleção a ser sincronizada. Uma sessão de sincronização é o período de tempo entre a abertura e o fechamento de uma conexão de sincronização.

Quando não estiver usando o Device Sync, o App Services atribui roles por documento e por solicitação.

Usando ou não o Device Sync, você pode definir um conjunto de funções específicas para coleções e funções padrão que se aplicam a qualquer outra coleção não especificada. Para atribuir uma função, o App Services avalia a expressão "aplicar quando" de cada função na ordem em que você a especificou. A primeira função cuja expressão "aplicar quando" é avaliada como verdadeira se torna a função atribuída. Se nenhuma função corresponder, o acesso será negado.

O conjunto de funções avaliadas para uma determinada solicitação ou sessão de sincronização depende da coleção que o usuário está acessando. Se você definiu alguma função em nível de coleção para a coleção, as funções em nível de coleção serão avaliadas. Caso contrário, as funções padrão da fonte de dados, se houver, serão avaliadas.

O App Services não "retorna" a funções padrão se nenhuma função em nível de coleção se aplicar. Se qualquer função de nível de coleção for definido, somente funções de nível de coleção serão avaliadas. As funções padrão são avaliadas se e somente se nenhuma função de nível de coleção foi definida.

Fluxograma de Atribuição de Função
clique para ampliar

Quando não estiver usando o Device Sync, o App Services atribui roles dinamicamente para cada documento. O usuário recebe uma função separada, ou nenhuma função, para cada documento que corresponda à consulta recebida.

Primeiro, seu App avalia e aplica filtros e depois executa a consulta.

Exemplo

A solicitação a seguir faz com que os App Services avaliem uma função para cada documento na coleção restaurants em que o campo city está definido como "Chicago":

db.restaurants.updateMany(
{ "city": "Chicago" },
{ "$set": { "city": "Chicago, IL" } }
);

Para cada documento retornado pela consulta, seu aplicativo avalia possíveis funções na ordem das funções e atribui a primeira função aplicável, se houver. Uma função se aplica a um determinado documento se sua expressão "aplicar quando" for avaliada como true quando executada no documento.

Exemplo

Um funcionário sempre estará em sua própria equipe, portanto, as funções Funcionário e Colega de equipe se aplicam a ele em seu próprio documento. No entanto, eles podem usar apenas uma função, por isso queremos usar Funcionário porque é mais específico.

Para configurar isso, especifique Funcionário antes de Colega de Equipe nas definições de função da coleção:

Definições de função que especificam Gerente primeiro, Funcionário segundo e Colega de equipe em terceiro.
{
"database": "<Database Name>",
"collection": "<Collection Name>",
"roles": [
{ "name": "Manager", ... },
{ "name": "Employee", ... },
{ "name": "Teammate", ... }
]
}

Ao usar o Device Sync, o App Services atribui funções no início de cada sessão do Flexible Sync para cada coleção sincronizada. A função determina quais permissões se aplicam a cada coleção durante uma sessão.

App Services atribuem no máximo uma função por coleção. Se você não especificou funções para uma determinada coleção sincronizada, o App Services usará as funções padrão. Se nenhuma função se aplicar a uma coleção, o usuário não poderá sincronizar (ou ler ou gravar) nenhuma entrada nessa coleção.

Uma função permanece atribuída durante a sessão. Se algo relevante para a função de sessão de um usuário for alterado no meio da sessão do usuário, o usuário não receberá uma função atualizada até que inicie uma nova sessão. Por exemplo, se os metadados do usuário ou a expressão "aplicar quando" da função forem alterados, o usuário continuará a usar a função existente para essa coleção até a próxima vez que iniciar uma sessão.

Existem algumas considerações especiais ao usar o Device Sync em relação ao sistema de permissões. Consulte Permissões compatíveis com o Device Sync.

Para obter um guia sobre como configurar o Sincronização Flexível com modelos de permissões comuns, consulte o Device Sync Permissions Guide (Guia de permissões do Device Sync).

Uma função "se aplica quando" expressão é uma expressão de regra que determina se a função deve ser atribuída.

Você pode utilizar variáveis de expressão para tornar papéis dinâmicos. Por exemplo, você pode usar a expansão %%user para se referir ao usuário específico que emitiu a solicitação. Isso permite que você personalize suas permissões de acesso a dados por usuário.

Quando não estiver usando o Device Sync, você poderá consultar o documento atual para o qual uma função está sendo atribuída. Por exemplo, você pode utilizar o %%root. Isso permite que você personalize suas permissões de acesso a dados por documento.

As expressões document_filters da função determinam se as permissões subsequentes em nível de documento e de campo da função podem ser avaliadas. Isso é necessário para o Device Sync.

Observação: o App Services avalia os filtros de documentos por documento. Eles não devem ser confundidos com os filtrosde query de nível superior.

Cada função de determinada coleção tem uma posição que determina a ordem em que são avaliadas e aplicadas. Cada função se aplica quando a expressão é avaliada em ordem de função até que uma função se aplique ou nenhuma função permaneça.

Um usuário pode ter apenas uma função por documento em uma determinada consulta. A ordem das funções determina qual função se aplica no caso de várias funções " se aplicarem quando as expressões " forem verdadeiras. Portanto, ao definir funções, coloque primeiro as funções mais específicas.

Se o Device Sync (modo flexível) estiver ativado, uma função atribuída deverá ser compatível com a sincronização. Consulte Funções Compatíveis com Sincronização para obter detalhes.

Você pode configurar as regras de acesso a dados de seu aplicativo na UI do App Services ou implantando arquivos de configuração com a App Services CLI:

  1. Clique em Rules no menu de navegação esquerdo e selecione uma coleção na lista de coleta da fonte de dados. Você também pode selecionar Default roles and filters para configurar as regras padrão para todo o cluster.

    Se nenhuma função tiver sido definida, você receberá um alerta para criar uma nova. Caso contrário, você verá uma lista ordenada de funções existentes.

  2. Clique em Add role para definir um novo role. Você pode usar um role predefinido como um ponto de partida ou clicar em Skip (start from scratch).

  3. Dê um nome ao role. O nome pode ser o que você quiser, mas deve ser exclusivo dentro de uma determinada collection. Considere usar nomes que descrevam o usuário e/ou seu relacionamento com os dados. Por exemplo, Admin ou Owner.

  4. Defina uma expressão "aplicar quando" que determine quando um determinado usuário tem o role para um determinado documento.

  5. Defina permissões de nível de documento para a função.

  6. Defina filtros de documento para a função. Isso é necessário para o Device Sync (modo flexível).

  7. Use o menu suspenso para selecionar permissões de nível de campo para a função. Se você selecionar Specify field-level permissions, insira os nomes de campo para os quais deseja definir permissões.

    Para cada campo que você nomeia e para Additional Fields, especifique permissões selecionando None, Read ou Read & Write.

  8. Salvar a função.

  9. Se uma coleção tiver mais de uma função atribuída, você poderá modificar a ordem das funções clicando nas setas em cada função.

  1. Puxe a versão mais recente do seu aplicativo.

    appservices pull --remote="<Your App ID>"
  2. Defina roles e filtros para uma ou mais collections. Você também pode definir roles e filtros padrão que se aplicam a qualquer collection não configurada. Consulte Configuração de regras para obter detalhes.

    /data_sources/<data source>/<database>/<collection>/rules.json
    {
    "database": "<Database Name>",
    "collection": "<Collection Name>",
    "roles": [
    {
    "name": "<Role Name>",
    "apply_when": {},
    "document_filters": {
    "read": { <Expression> },
    "write": { <Expression> }
    },
    "insert": true,
    "delete": true,
    "search": true,
    "fields": {
    "myField": { "read": true, "write": true }
    },
    "additional_fields": { "read": true, "write": true }
    }
    ],
    "filters": [
    {
    "name": "<Filter Name>",
    "apply_when": {},
    "query": {},
    "projection": {}
    }
    ]
    }
    /data_sources/<data source>/default_rule.json
    {
    "roles": [
    {
    "name": "<Role Name>",
    "apply_when": {},
    "document_filters": {
    "read": { <Expression> },
    "write": { <Expression> }
    },
    "insert": true,
    "delete": true,
    "search": true,
    "fields": {
    "myField": { "read": true, "write": true }
    },
    "additional_fields": { "read": true, "write": true }
    }
    ],
    "filters": [
    {
    "name": "<Filter Name>",
    "apply_when": {},
    "query": {},
    "projection": {}
    }
    ]
    }
  3. Implemente seu aplicativo.

    appservices push

Observação

Consideração de segurança para permissões baseadas em roles de App Services

Enquanto filtros e permissões baseadas em roles podem ocultar documentos e campos específicos dentro de uma collection, é possível que os dados possam ser expostos se o sistema permitir que queries arbitrárias acessem a collection.

Por exemplo, consultas ou roles que geram erros dependendo dos valores armazenados em uma collection (como erros de divisão por zero) podem revelar informações sobre documentos, mesmo que uma role ou filtro impeça o usuário que faz query de exibir documentos diretamente. Os usuários também podem fazer inferências sobre os dados subjacentes de outras maneiras (como medindo o tempo de execução da query, que pode ser afetado pela distribuição dos dados).

Esteja ciente de que isso é possível e audite seus padrões de acesso aos dados quando necessário.

Voltar

Definir permissões de acesso aos dados