As funções no Sync Gateway são frequentemente ignoradas porque parecem mais complexas de usar do que os usuários e os canais. No entanto, elas fornecem uma camada adicional de abstração e podem simplificar muito seu modelo de dados. Veja o exemplo de um aplicativo para compartilhar avaliações de restaurantes por cidade. Usuários diferentes podem ter privilégios diferentes, como moderadores e usuários convidados. Neste tutorial, você configurará o Função de sincronização para permitir que usuários autenticados desse aplicativo aprovem, publiquem avaliações ou atribuam funções a outros usuários.
No total, haverá 3 tipos de funções no aplicativo:
- nível 1: usuários com o nível 1 pode publicar avaliações, mas elas devem ser aceitas por usuários com a função nível 3 (ou seja, moderadores) sejam públicos.
- nível 2Usuários podem publicar comentários sem a necessidade de validação dos moderadores. Isso significa que eles podem publicar um comentário sem precisar de aprovação.
- nível 3Os usuários podem aprovar ou rejeitar as avaliações. Vamos começar!
Baixar o Sync Gateway
Faça o download do Sync Gateway e descompacte o arquivo:
https://www.couchbase.com/downloads?family=sync-gateway
Você encontrará o binário do Sync Gateway no diretório caixa
e exemplos de arquivos de configuração na pasta exemplos
pasta. Copie o users-role.json
na raiz do seu projeto:
1 |
cp ~/Downloads/couchbase-sincronização-portal/exemplos/usuários-funções.json /caminho/para/projeto/sincronização-portal-configuração.json |
Na próxima seção, você atualizará o arquivo de configuração para criar usuários e funções.
Edição do arquivo de configuração
Em sync-gateway-config.json
atualize o objeto db para leitura:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
{ "log": ["*"], "bancos de dados": { "db": { "servidor": "walrus:", "usuários": { "jens": { "admin_roles": ["nível-1"], "senha": "letmein" }, "andy": { "admin_roles": ["level-2"], "senha": "letmein" }, "william": { "admin_roles": [], "senha": "letmein" }, "traun": { "admin_roles": ["level-3"], "senha": "letmein" } }, "funções": { "nível-1": {}, "level-2": {}, "level-3": {} }, } } } |
Algumas coisas estão acontecendo acima:
- Você cria o usuário
jens
com onível 1
função. - Você cria o usuário
andy
com onível 2
função. - Você cria o usuário
William
sem nenhuma função. - Você cria o usuário
traun
com onível 3
função. - Você define as 3 funções. Assim como os usuários, as funções devem ser criadas explicitamente na API REST do Admin ou no arquivo de configuração.
Observação sobre a criação de funções
A maneira mais fácil de criar funções é no arquivo de configuração, como você fez acima.
Outra maneira de criar funções é por meio da API REST do administrador. Desde que você exponha um ponto de extremidade para criar essas funções a partir do aplicativo, é possível criar funções dinamicamente enviando uma solicitação para o servidor do aplicativo (setas azuis), que criará a função e enviará de volta um 201 Created se tiver sido bem-sucedido (setas verdes).
Na próxima seção, você adicionará a função Sync para lidar com operações de gravação e leitura para os três tipos diferentes de documentos (restaurante
, revisão
, perfil
).
Adição da função Sync
Funções e usuários podem receber acesso a canais. Os usuários podem receber funções e herdar qualquer acesso ao canal para essas funções.
O acesso ao canal determina a segurança de leitura de um usuário. A segurança de gravação também pode ser baseada em canais (usando requireAccess), mas também pode ser baseado em usuário/função (requireUser e requireRole), ou conteúdo do documento (usando lançar).
O acesso de leitura e gravação aos documentos é independente. Na verdade, o acesso de gravação é totalmente controlado pela sua função de sincronização: a menos que a função de sincronização rejeite a revisão, um cliente pode modificar qualquer documento. Todas as funções require* atuam como validadores, mas também como APIs de acesso de gravação.
É muito comum ver a função de sincronização criar muitos e muitos canais. Isso é absolutamente normal. No entanto, pode ser complicado atribuir cada usuário a um canal. Em vez disso, você pode usar uma função!
Mais uma vez, os usuários podem receber funções e herdar qualquer acesso ao canal para essas funções.
Isso significa que você pode conceder a um usuário acesso a vários canais simplesmente atribuindo uma função. Isso é muito eficiente porque você não precisa atribuir cada usuário a um canal. Basta conceder o acesso da função ao canal e atribuir os usuários à função.
Com isso em mente, substitua a função de sincronização em sync-gateway-config.json
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
função(doc, oldDoc) { se (doc.tipo == "restaurante"){ canal(doc.restaurant_id); } mais se (doc.tipo == "revisão") { interruptor(doc.função) { caso "nível-1": // Etapa 1 requireRole(doc.função); var nome do canal = doc.proprietário + "-em-revisão"; canal(nome do canal); acesso(doc.proprietário, nome do canal); acesso("role:level-3", nome do canal); quebra; caso "level-2": // Etapa 2 requireRole(doc.função); canal(doc.restaurant_id); quebra; caso "level-3": // Etapa 3 requireRole(doc.função); canal(doc.restaurant_id); quebra; } } mais se (doc.tipo == "profile" (perfil)) { requireRole("level-3"); função(doc.nome, "role:" + doc.função); } } |
Veja o que está acontecendo:
- Usuários com o nível 1 tem acesso de gravação porque você chama a função
canal
função. Em seguida, conceda a esse usuário e à função nível 3 acesso a esse canal. É aqui que o poder das funções realmente se destaca. Ao conceder acesso a uma função, você está concedendo a todos os usuários com essa função acesso ao canal. A chamada pararequireRole
concederá a permissão de gravação. - Documentos do tipo
revisão
criado por um nível 2 função: o documento deve ir para o mesmo canal que o restaurante ao qual pertence. A chamada pararequireRole
concederá a permissão de gravação. - Documentos do tipo
revisão
criado por um nível 3 função: o documento deve ir para o canal desse restaurante. nível 3 os usuários também têm acesso de leitura a todos os{nome_do_usuário}-em-revisão
canais. Eles podem aprovar/rejeitar as avaliações pendentes de outros usuários.
Inicie o Sync Gateway com o arquivo de configuração atualizado:
1 |
$ ~/Downloads/couchbase-sincronização-portal/caixa/portais de sincronização /caminho/para/projeto/sincronização-portal-configuração.json |
Neste exemplo, você está utilizando os três principais recursos das funções:
- Conceder a uma função acesso a um canal e, indiretamente, a todos os usuários com essa função.
- Conceder permissão de gravação usando um requireRole.
- Atribuição de uma função a um usuário.
Agora você pode testar se a função Sync se comporta como esperado com as seguintes solicitações HTTP.
Execução de cenários diferentes
Cenário 1
Documentos do tipo revisão
criado por um nível 1 usuário: o documento deve ir para a pasta {nome_do_usuário}-em-revisão
e os usuários com o canal nível 3 A função também deve ter acesso a esse canal.
Faça login como usuário jens
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
enrolar -vX POST -H 'Content-Type: application/json' :4984/db/_session -d '{"name": "jens", "password": "letmein"}' > POST /db/_session HTTP/1.1 > Usuário-Agente: enrolar/7.37.1 > Anfitrião: :4984 > Aceitar: */* > Conteúdo-Tipo: aplicativo/json > Conteúdo-Comprimento: 39 > * carregar completamente enviado desligado: 39 fora de 39 bytes < HTTP/1.1 200 OK < Conteúdo-Comprimento: 103 < Conteúdo-Tipo: aplicativo/json * Servidor Couchbase Sincronização Gateway/1.1.0 é não na lista negra < Servidor: Couchbase Sincronização Gateway/1.1.0 < Conjunto-Biscoito: SyncGatewaySession=6c52b8cd2c706d55e97d9606058c0abd90a5d200; Caminho=/db/; Expirações=Terça-feira, 07 Julho 2015 08:23:03 UTC < Data: Mês, 06 Julho 2015 08:23:03 GMT < * Conexão #0 para o host intacto {"authentication_handlers":["default","cookie"],"ok":verdadeiro,"userCtx":{"canais":{"!":1},"name" (nome):"jens"}}⏎ |
Salvar um novo documento do tipo revisão
(substitua o token pelo que foi retornado no Set-Cookie
cabeçalho acima):
1 2 3 4 |
enrolar -vX POST -H 'Content-Type: application/json' --biscoito 'SyncGatewaySession=d007ceb561f0111512c128040c32c02ea9d90234' :4984/db/ -d '{"type": "revisão", "função": "level-1", "owner": "jens"}' |
- Verifique se o usuário
jens
tem acesso ao canaljens-em-revisão
e o documento de comentários está lá. - Verifique se o usuário
traun
tem acesso ao canaljens-em-revisão
.
Você também pode visualizar os canais aos quais esse documento pertence e as funções/usuários que têm acesso a ele na seção Documentos
guia:
Cenário 2
Conceder acesso de gravação usando uma função.
Fazer login como andy
e substitua o token pelo que você recebeu de volta da solicitação de login.
1 2 3 4 |
enrolar -vX POST -H 'Content-Type: application/json' --biscoito 'SyncGatewaySession=6e7ce145ae53c83de436b47ae37d8d94beebebea' :4984/db/ -d '{"type": "revisão", "função": "level-2", "owner": "andy", "restaurant_id": "123"}' |
- Verifique se o comentário foi adicionado ao canal do restaurante (chamado
123
neste exemplo).
Cenário 3
Atribuição de uma função a um usuário.
Fazer login como traun
e substitua o token pelo que você recebeu de volta da solicitação de login.
1 2 3 4 |
enrolar -vX POST -H 'Content-Type: application/json' --biscoito 'SyncGatewaySession=3a5c5a67ff67643f8ade175363c65354584429e9' :4984/db/ -d '{"type": "profile", "name": "william", "role": "level-3"}' |
- Verifique se
William
tem funçãonível 3
. - Verifique se
William
tem acesso aojens-em-revisão
canal.
Conclusão
Neste tutorial, você aprendeu a usar canais e requireRole para validar e executar operações de gravação de forma dinâmica. Você também atribuiu vários canais de uma só vez a vários usuários usando a API de função.