{"id":16726,"date":"2025-01-01T22:07:24","date_gmt":"2025-01-02T06:07:24","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=16726"},"modified":"2025-06-16T10:43:35","modified_gmt":"2025-06-16T17:43:35","slug":"permit-io-couchbase-access-control","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/permit-io-couchbase-access-control\/","title":{"rendered":"Como adicionar RBAC externo aos dados do Couchbase usando o Permit.io"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">\u00c0 medida que os aplicativos da Web aumentam em complexidade, \u00e9 essencial garantir que somente os usu\u00e1rios certos tenham acesso aos dados do Couchbase.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Sem um sistema de controle de acesso bem definido, usu\u00e1rios n\u00e3o autorizados podem acessar informa\u00e7\u00f5es confidenciais ou realizar a\u00e7\u00f5es prejudiciais.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Integra\u00e7\u00e3o <\/span><a href=\"https:\/\/permit.io\/\"><span style=\"font-weight: 400;\">Permiss\u00e3o<\/span><\/a><span style=\"font-weight: 400;\"> com o Couchbase oferece uma solu\u00e7\u00e3o robusta para gerenciar o controle de acesso em aplicativos que utilizam o Couchbase como banco de dados. O Permit foi projetado para simplificar o processo de autoriza\u00e7\u00e3o, permitindo que os desenvolvedores implementem um controle de acesso refinado e, ao mesmo tempo, aproveitem os recursos avan\u00e7ados de gerenciamento de dados do Couchbase.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Neste guia, vamos criar um sistema de solicita\u00e7\u00e3o simples em que passamos uma consulta do Couchbase e verificamos se o usu\u00e1rio relevante tem acesso para executar essa consulta com base em verifica\u00e7\u00f5es de formato baseadas em regras. Se o usu\u00e1rio n\u00e3o tiver permiss\u00e3o, ele ser\u00e1 impedido de executar a consulta; se tiver permiss\u00e3o, poder\u00e1 prosseguir.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">O que \u00e9 o Couchbase?<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">O Couchbase \u00e9 um banco de dados NoSQL robusto, otimizado para armazenar e gerenciar documentos JSON. Sua capacidade de lidar com objetos JSON \u00e9 o que o diferencia dos armazenamentos tradicionais de valores-chave. Essa flexibilidade permite que os desenvolvedores armazenem, recuperem e gerenciem facilmente dados n\u00e3o estruturados ou semiestruturados, o que o torna extremamente \u00fatil para aplicativos com modelos de dados em evolu\u00e7\u00e3o.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Um dos principais pontos fortes do Couchbase \u00e9 sua <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/sqlplusplus\/\"><span style=\"font-weight: 400;\">Capacidade de consulta SQL++<\/span><\/a><span style=\"font-weight: 400;\"> que fornece uma sintaxe familiar semelhante ao SQL para documentos JSON (anteriormente conhecido como N1QL). Isso permite que os desenvolvedores realizem consultas avan\u00e7adas em seus dados JSON, como a possibilidade de adicionar express\u00f5es de tabela comuns, uni\u00f5es e muito mais. Essa camada de consulta do Couchbase permite que os dados sejam armazenados no formato JSON e, ao mesmo tempo, oferece suporte a consultas sofisticadas.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">O que \u00e9 RBAC?<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/h2>\n<p><a href=\"https:\/\/www.permit.io\/rbac\"><span style=\"font-weight: 400;\">Controle de acesso baseado em fun\u00e7\u00e3o (RBAC) <\/span><\/a><span style=\"font-weight: 400;\">\u00e9 um modelo que ajuda a simplificar o gerenciamento de permiss\u00f5es dentro dos aplicativos, organizando as permiss\u00f5es do sistema em torno de fun\u00e7\u00f5es e n\u00e3o de indiv\u00edduos espec\u00edficos. Ele oferece uma abordagem para gerenciar e restringir o acesso a recursos espec\u00edficos em um determinado aplicativo ou organiza\u00e7\u00e3o.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para implementar o controle de acesso externo baseado em fun\u00e7\u00e3o com o Couchbase, utilizaremos <\/span><a href=\"https:\/\/permit.io\/\"><span style=\"font-weight: 400;\">Permiss\u00e3o.io<\/span><\/a><span style=\"font-weight: 400;\">uma solu\u00e7\u00e3o completa para gerenciar permiss\u00f5es e fun\u00e7\u00f5es de usu\u00e1rios com uma interface de usu\u00e1rio simples. Criaremos um aplicativo React com o pacote Express em que o usu\u00e1rio passa a consulta SQL++ com a ajuda do Couchbase. Em seguida, veremos se o usu\u00e1rio tem a permiss\u00e3o relevante. Se n\u00e3o tiver, enviaremos uma mensagem. Se tiver, poderemos modificar a solicita\u00e7\u00e3o.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Configurar um cluster do Couchbase<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">A primeira etapa \u00e9 criar uma conta Capella gratuita. Para isso, navegue at\u00e9 <\/span><a href=\"https:\/\/cloud.couchbase.com\/\"><span style=\"font-weight: 400;\">cloud.couchbase.com <\/span><\/a><span style=\"font-weight: 400;\">e escolha <\/span><b>Criar conta<\/b><span style=\"font-weight: 400;\">Use uma combina\u00e7\u00e3o de e-mail e senha. Voc\u00ea tamb\u00e9m pode se inscrever com sua conta do GitHub ou do Google.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Depois de criar sua conta no Capella, voc\u00ea pode prosseguir com a cria\u00e7\u00e3o do cluster do banco de dados. Voc\u00ea pode escolher o <\/span><i><span style=\"font-weight: 400;\">N\u00edvel gratuito<\/span><\/i><span style=\"font-weight: 400;\"> para o cluster.<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image16.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16728\" style=\"border: 1px black solid;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image16-1024x607.jpg\" alt=\"\" width=\"900\" height=\"533\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image16-1024x607.jpg 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image16-300x178.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image16-768x455.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image16.jpg 1248w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Na p\u00e1gina inicial de sua conta, depois de fazer login, clique no bot\u00e3o<\/span><b> + Criar banco de dados<\/b><span style=\"font-weight: 400;\"> no canto superior direito e preencha os detalhes necess\u00e1rios, inclusive o nome que voc\u00ea escolheu para o banco de dados.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Quando estiver pronto, clique no bot\u00e3o final <\/span><b>Criar banco de dados<\/b><span style=\"font-weight: 400;\"> bot\u00e3o.<\/span><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image17.jpg\"><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16729\" style=\"border: 1px solid black;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image17-1024x327.jpg\" alt=\"\" width=\"900\" height=\"287\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image17-1024x327.jpg 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image17-300x96.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image17-768x245.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image17.jpg 1248w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Agora voc\u00ea criou um cluster. A pr\u00f3xima etapa \u00e9 adicionar um bucket para armazenar seus dados. Um bucket \u00e9 semelhante a uma tabela de banco de dados, mas com diferen\u00e7as significativas. Como voc\u00ea est\u00e1 trabalhando com dados JSON n\u00e3o estruturados e semiestruturados, um \u00fanico bucket pode conter diversos tipos de dados.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">V\u00e1 at\u00e9 o site <\/span><b>Ferramentas de dados<\/b><span style=\"font-weight: 400;\"> onde voc\u00ea encontrar\u00e1 um conjunto de dados pr\u00e9-importado conhecido como <\/span><i><span style=\"font-weight: 400;\">amostra de viagem<\/span><\/i><span style=\"font-weight: 400;\"> conjunto de dados.<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image18.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16730\" style=\"border: 1px black solid;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image18-1024x596.png\" alt=\"\" width=\"900\" height=\"524\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image18-1024x596.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image18-300x175.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image18-768x447.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image18.png 1248w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Voc\u00ea pode inserir mais documentos ou criar baldes completamente novos, se necess\u00e1rio. Mas, para esta demonstra\u00e7\u00e3o, usaremos o <\/span><i><span style=\"font-weight: 400;\">amostra de viagem<\/span><\/i><span style=\"font-weight: 400;\"> conjunto de dados.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A figura a seguir ilustra a rela\u00e7\u00e3o entre os diferentes tipos de documentos no conjunto de dados de amostra de viagem. Ela mostra os campos de chave prim\u00e1ria, ID e tipo que cada documento possui, juntamente com alguns outros campos representativos em cada tipo de documento.<\/span><\/p>\n<p><br style=\"font-weight: 400;\" \/><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image19.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-16731\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image19.png\" alt=\"\" width=\"538\" height=\"490\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image19.png 538w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image19-300x273.png 300w\" sizes=\"auto, (max-width: 538px) 100vw, 538px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Usaremos esse conjunto de dados em nossa demonstra\u00e7\u00e3o. Para interagir com os dados no Capella a partir do seu aplicativo, voc\u00ea precisa conhecer a string de conex\u00e3o e criar credenciais de acesso.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Voc\u00ea pode encontrar a string de conex\u00e3o clicando no \u00edcone <\/span><b>Conectar<\/b><span style=\"font-weight: 400;\"> na barra de navega\u00e7\u00e3o superior do painel.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para adicionar credenciais de acesso, navegue at\u00e9 essa p\u00e1gina em suas configura\u00e7\u00f5es do Capella, conforme mostrado abaixo, e clique no bot\u00e3o <\/span><b>+ Criar acesso ao banco de dados<\/b><span style=\"font-weight: 400;\"> bot\u00e3o. Forne\u00e7a um nome e uma senha e clique em <\/span><b>Salvar<\/b><span style=\"font-weight: 400;\">. Certifique-se de adicionar imediatamente as credenciais a um <\/span><i><span style=\"font-weight: 400;\">.env<\/span><\/i><span style=\"font-weight: 400;\"> pois voc\u00ea n\u00e3o conseguir\u00e1 recuperar a senha novamente depois disso.<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image20.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16732\" style=\"border: 1px black solid;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image20-1024x458.jpg\" alt=\"\" width=\"900\" height=\"403\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image20-1024x458.jpg 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image20-300x134.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image20-768x343.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image20.jpg 1248w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Depois de criar suas credenciais, a configura\u00e7\u00e3o do Capella estar\u00e1 conclu\u00edda. Vamos passar para a parte do RBAC!<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Configurar permiss\u00f5es RBAC no Permit.io<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Certifique-se de ter configurado sua conta em <\/span><a href=\"https:\/\/permit.io\/\"><span style=\"font-weight: 400;\">Permiss\u00e3o.io <\/span><\/a><span style=\"font-weight: 400;\">e criou um projeto. Nesta demonstra\u00e7\u00e3o, usaremos o projeto padr\u00e3o que foi criado.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">V\u00e1 para a se\u00e7\u00e3o Policy Editor e, na se\u00e7\u00e3o Resources (Recursos), adicione os recursos relevantes correspondentes ao <\/span><i><span style=\"font-weight: 400;\">amostra de viagem<\/span><\/i><span style=\"font-weight: 400;\"> conjunto de dados.<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image21.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16733\" style=\"border: 1px solid black;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image21-1024x353.png\" alt=\"\" width=\"900\" height=\"310\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image21-1024x353.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image21-300x103.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image21-768x265.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image21.png 1248w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Nesse caso, adicionaremos os recursos como <\/span><i><span style=\"font-weight: 400;\">Rota<\/span><\/i><span style=\"font-weight: 400;\">, <\/span><i><span style=\"font-weight: 400;\">Aeroporto<\/span><\/i><span style=\"font-weight: 400;\">, <\/span><i><span style=\"font-weight: 400;\">Hotel,<\/span><\/i><span style=\"font-weight: 400;\"> e <\/span><i><span style=\"font-weight: 400;\">Companhia a\u00e9rea<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image22.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16734\" style=\"border: 1px solid black;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image22-1024x665.jpg\" alt=\"\" width=\"900\" height=\"584\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image22-1024x665.jpg 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image22-300x195.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image22-768x498.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image22.jpg 1248w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Certifique-se de que voc\u00ea adicionou as a\u00e7\u00f5es relevantes.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Em seguida, v\u00e1 at\u00e9 o <\/span><b>Fun\u00e7\u00f5es<\/b><span style=\"font-weight: 400;\"> para adicionar as fun\u00e7\u00f5es de usu\u00e1rio espec\u00edficas associadas ao conjunto de dados de amostra de viagem.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para o conjunto de dados que estamos usando, voc\u00ea precisar\u00e1 adicionar as seguintes fun\u00e7\u00f5es: <\/span><i><span style=\"font-weight: 400;\">Viajante<\/span><\/i><span style=\"font-weight: 400;\">, <\/span><i><span style=\"font-weight: 400;\">Agente de viagens<\/span><\/i><span style=\"font-weight: 400;\">, <\/span><i><span style=\"font-weight: 400;\">Equipe da companhia a\u00e9rea<\/span><\/i><span style=\"font-weight: 400;\"> e <\/span><i><span style=\"font-weight: 400;\">Equipe do hotel<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><br style=\"font-weight: 400;\" \/><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image23.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16735\" style=\"border: 1px solid black;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image23-1024x450.jpg\" alt=\"\" width=\"900\" height=\"396\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image23-1024x450.jpg 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image23-300x132.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image23-768x337.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image23.jpg 1248w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><span style=\"font-weight: 400;\">Agora, v\u00e1 at\u00e9 o site <\/span><b>Editor de pol\u00edticas<\/b><span style=\"font-weight: 400;\"> e defina as defini\u00e7\u00f5es relevantes de controle de acesso baseado em fun\u00e7\u00e3o para cada fun\u00e7\u00e3o espec\u00edfica correspondente aos recursos definidos. Voc\u00ea pode consultar a imagem abaixo para ver os atributos espec\u00edficos que ajudar\u00e3o a criar as pol\u00edticas. Em seguida, v\u00e1 para a se\u00e7\u00e3o <\/span><b>Editor de pol\u00edticas<\/b><span style=\"font-weight: 400;\">Marque todas as caixas de sele\u00e7\u00e3o, conforme mostrado abaixo, e salve as altera\u00e7\u00f5es.<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image24.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16736\" style=\"border: 1px solid black;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image24-557x1024.png\" alt=\"\" width=\"557\" height=\"1024\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image24-557x1024.png 557w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image24-163x300.png 163w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image24-768x1412.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image24-836x1536.png 836w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image24-300x551.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image24.png 940w\" sizes=\"auto, (max-width: 557px) 100vw, 557px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Em seguida, v\u00e1 para a se\u00e7\u00e3o de diret\u00f3rio para criar um novo locat\u00e1rio. Depois de criar o locat\u00e1rio, adicione usu\u00e1rios com base em suas fun\u00e7\u00f5es.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Criaremos novos usu\u00e1rios para funcion\u00e1rios de hot\u00e9is, agentes de viagens e viajantes.<\/span><\/p>\n<p><br style=\"font-weight: 400;\" \/><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image13.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16737\" style=\"border: 1px solid black;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image13-1024x578.jpg\" alt=\"\" width=\"900\" height=\"508\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image13-1024x578.jpg 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image13-300x169.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image13-768x433.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image13.jpg 1248w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Para cada usu\u00e1rio, adicione seu e-mail, nome, sobrenome e fun\u00e7\u00e3o espec\u00edfica na se\u00e7\u00e3o de acesso de n\u00edvel superior.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Isso \u00e9 tudo o que \u00e9 necess\u00e1rio para criar um modelo de controle de acesso baseado em fun\u00e7\u00e3o (RBAC) para o conjunto de dados de amostra de viagem usando a interface do usu\u00e1rio do Permit.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Implementa\u00e7\u00e3o de RBAC refinado para Couchbase com Permit.io<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Agora vamos implementar nosso analisador de consultas SQL++ do Couchbase com o Permit.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Primeiro, configuraremos um projeto Node.js com o Express para nosso servidor de backend. Usaremos o SDK do Couchbase para Node.js e o SDK do Permit.io.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Aqui est\u00e1 o nosso <\/span><i><span style=\"font-weight: 400;\">package.json<\/span><\/i><span style=\"font-weight: 400;\"> com as depend\u00eancias necess\u00e1rias:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">{\r\n  \"name\": \"backend\",\r\n  \"version\": \"1.0.0\",\r\n  \"main\": \"index.js\",\r\n  \"scripts\": {\r\n    \"test\": \"echo \\\"Error: no test specified\\\" &amp;&amp; exit 1\"\r\n  },\r\n  \"keywords\": [],\r\n  \"author\": \"\",\r\n  \"license\": \"ISC\",\r\n  \"description\": \"\",\r\n  \"dependencies\": {\r\n    \"cors\": \"^2.8.5\",\r\n    \"couchbase\": \"^4.4.3\",\r\n    \"dotenv\": \"^16.4.5\",\r\n    \"express\": \"^4.21.1\",\r\n    \"permitio\": \"^2.6.1\"\r\n  }\r\n}<\/pre>\n<h3><span style=\"font-weight: 400;\">Implementa\u00e7\u00e3o do servidor<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Vamos dividi-lo em componentes-chave:<\/span><\/p>\n<h4><b>Inicializa\u00e7\u00e3o<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">Come\u00e7amos configurando nosso servidor Express e inicializando o cliente Permit.io:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">const express = require('express');\r\nconst cors = require('cors');\r\nconst { Permit } = require('permitio'); const couchbase = require('couchbase'); require('dotenv').config();\r\nconst app = express();\r\nconst port = process.env.PORT || 3001;\r\napp.use(cors({\r\n  origin: 'https:\/\/localhost:5173',\r\n  methods: ['POST'],\r\n  allowedHeaders: ['Content-Type'],\r\n}));\r\n\r\n\/\/ Initialize Permit client\r\nconst permit = new Permit({\r\n  token: process.env.PERMIT_SDK_TOKEN,\r\n  pdp: \"https:\/\/cloudpdp.api.permit.io\"\r\n});<\/pre>\n<h4><b>An\u00e1lise de consultas SQL++<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">Para trabalhar com as consultas de entrada do Couchbase, precisamos analis\u00e1-las. Implementamos um analisador simples que extrai as cl\u00e1usulas SELECT, FROM e WHERE da consulta de entrada.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Vamos dar uma olhada nos componentes principais do nosso analisador:<\/span><\/p>\n<p><b>Analisador de consultas<\/b><\/p>\n<p><span style=\"font-weight: 400;\">A classe QueryParser \u00e9 a base da nossa implementa\u00e7\u00e3o de seguran\u00e7a. Ela lida com duas tarefas essenciais:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>An\u00e1lise de consulta: <\/b><span style=\"font-weight: 400;\">P<\/span><span style=\"font-weight: 400;\">utiliza consultas SQL++ para determinar:<\/span><\/li>\n<\/ol>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Tipo de opera\u00e7\u00e3o SELECT, UPDATE, DELETE, INSERT<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Recurso que est\u00e1 sendo acessado<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Valida\u00e7\u00e3o da estrutura da consulta<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"nums:false lang:js decode:true\">static parseQuery(query) {\r\n\u00a0 \/\/ Extract resource from SELECT statement (word before t const\r\n\u00a0 selectResourcePattern = \/SELECT\\s+(\\w+)\\.\/i;\r\n\r\n\u00a0 \/\/ Basic regex patterns for SQL operations\r\n\u00a0 const patterns = {\r\n\u00a0 \u00a0 select: \/^\\s*SELECT\\s+(?:(?!FROM).)*\\s+FROM\\s+[`]?(\\\r\n\u00a0 \u00a0 update: \/^\\s*UPDATE\\s+[`]?(\\w+)[`]?(?:\\.`?(\\w+)`?)?(\r\n\u00a0 \u00a0 delete: \/^\\s*DELETE\\s+FROM\\s+[`]?(\\w+)[`]?(?:\\.`?(\\w\r\n\u00a0 \u00a0 insert: \/^\\s*INSERT\\s+INTO\\s+[`]?(\\w+)[`]?(?:\\.`?(\\w\r\n\u00a0 };\r\n\r\n\u00a0 \/\/ Determine operation type and extract resource let operation = '';\r\n\u00a0 let resource = '';\r\n\u00a0 if (patterns.select.test(query)) {\r\n\u00a0 \u00a0 operation = 'read';\r\n\u00a0 \u00a0 const resourceMatch = query.match(selectResourcePatt if (resourceMatch &amp;&amp; resourceMatch[1]) {\r\n\u00a0 \u00a0 resource = resourceMatch[1];\r\n\u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 throw new Error('Unable to parse resource from S\r\n\u00a0 \u00a0 }\r\n\u00a0 } else if (patterns.update.test(query)) { operation = 'update';\r\n\u00a0 \u00a0 const matches = query.match(patterns.update); resource = matches[3] || matches[2] || matches[1];\r\n\u00a0 } else if (patterns.delete.test(query)) {\r\n\u00a0 \u00a0 operation = 'delete';\r\n\u00a0 \u00a0 const matches = query.match(patterns.delete); resource = matches[3] || matches[2] || matches[1];\r\n\u00a0 } else if (patterns.insert.test(query)) { operation = 'create';\r\n\u00a0 \u00a0 const matches = query.match(patterns.insert); resource = matches[3] || matches[2] || matches[1];\r\n\u00a0 }\r\n\r\n\u00a0 if (!operation || !resource) {\r\n\u00a0 \u00a0 throw new Error('Unable to parse query operation or\r\n\u00a0 }\r\n\r\n\u00a0 return {\r\n\u00a0 \u00a0 query,\r\n\u00a0 \u00a0 permission: operation,\r\n\u00a0 \u00a0 resource: resource.toLowerCase()\r\n\u00a0 };\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>2. <b>Valida\u00e7\u00e3o de seguran\u00e7a<\/b><span style=\"font-weight: 400;\">: Implementa verifica\u00e7\u00f5es de seguran\u00e7a para evitar inje\u00e7\u00e3o de SQL e outros ataques:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">static validateQuery(query) {\r\n\r\n\u00a0 \/\/ Basic security validation\r\n\u00a0 const disallowedPatterns = [\r\n\u00a0   \/;.*;\/i,           \/\/ Multiple statements\r\n\u00a0   \/--\/,              \/\/ SQL comments\r\n\u00a0   \/\\\/\\*\/,            \/\/ Block comments\r\n\u00a0   \/xp_\/i,            \/\/ Extended stored procedur\r\n\u00a0   \/EXECUTE\\s+sp_\/i,  \/\/ Stored procedure executi\r\n\u00a0   \/EXEC\\s+sp_\/i,     \/\/ Stored procedure executi\r\n\u00a0   \/INTO\\s+OUTFILE\/i, \/\/ File operations\r\n\u00a0   \/LOAD_FILE\/i,      \/\/ File operations\r\n\u00a0 ];\r\n\r\n\u00a0 for (const pattern of disallowedPatterns) {\r\n\u00a0 \u00a0 if (pattern.test(query)) {\r\n\u00a0 \u00a0 \u00a0 throw new Error('Query contains potentially harm\r\n\u00a0 \u00a0 }\r\n\u00a0 }\r\n\r\n\u00a0 return true;\r\n}<\/pre>\n<h4><b>Gerenciamento de permiss\u00f5es<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">O <\/span><i><span style=\"font-weight: 400;\">TravelQueryChecker<\/span><\/i><span style=\"font-weight: 400;\"> lida com a l\u00f3gica de permiss\u00e3o principal:<\/span><\/p>\n<ol>\n<li><b>Inicializa\u00e7\u00e3o:<\/b><span style=\"font-weight: 400;\"> Configura as conex\u00f5es com o Permit.io e o Couchbase:<\/span><\/li>\n<\/ol>\n<pre class=\"nums:false lang:js decode:true\">class TravelQueryChecker {\r\n  constructor() {\r\n    this.permit = new Permit({\r\n      token: process.env.PERMIT_SDK_TOKEN,\r\n      pdp: \"https:\/\/cloudpdp.api.permit.io\"\r\n    });\r\n\r\n    this.clusterConnStr = 'couchbases:\/\/cb.6gj2r4ygxyjrfcgf\r\n    this.username = 'shivay1';\r\n    this.password = 'Shivay1234!';\r\n    this.bucketName = 'travel-sample';\r\n  }\r\n\r\n  async init() {\r\n    try {\r\n      this.cluster = await couchbase.connect(this.clusterC username: this.username,\r\n        password: this.password,\r\n        configProfile: 'wanDevelopment',\r\n      });\r\n\r\n      this.bucket = this.cluster.bucket(this.bucketName); \r\n      this.collection = this.bucket.defaultCollection(); \r\n      console.log('Connected to Couchbase Capella');\r\n    } catch (error) {\r\n      console.error('Couchbase connection error:', error); \r\n      throw error;\r\n  }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<ol start=\"2\">\n<li><b>Verifica\u00e7\u00e3o de permiss\u00e3o:<\/b><span style=\"font-weight: 400;\"> Verifica as permiss\u00f5es do usu\u00e1rio por meio do Permit.io:<\/span><\/li>\n<\/ol>\n<pre class=\"nums:false lang:js decode:true\">async checkQueryPermission(userId, queryConfig) { if (!queryConfig) \r\n  {\r\n    return { permitted: false, error: 'Invalid query con\r\n  }\r\n  try {\r\n    const permitted = await this.permit.check(\r\n      String(userId),\r\n      queryConfig.permission,\r\n      {\r\n        type: queryConfig.resource,\r\n        tenant: \"default\",\r\n        resource: queryConfig.resource\r\n      }\r\n   );\r\n \r\n    return {\r\n      permitted,\r\n      query: queryConfig.query,\r\n      permission: queryConfig.permission,\r\n      resource: queryConfig.resource\r\n    };\r\n    } catch (error) {\r\n      console.error('Permission check error:', error); \r\n      return { permitted: false, error: error.message };\r\n    }\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Essa fun\u00e7\u00e3o usa o <\/span><a href=\"https:\/\/permit.io\/\"><span style=\"font-weight: 400;\">Permiss\u00e3o.io<\/span><\/a><span style=\"font-weight: 400;\"> SDK para verificar se um usu\u00e1rio tem permiss\u00e3o para executar uma a\u00e7\u00e3o espec\u00edfica em um recurso.<\/span><\/p>\n<p>3. <b>Execu\u00e7\u00e3o de consultas<\/b><span style=\"font-weight: 400;\">: Lida com o fluxo completo, desde a verifica\u00e7\u00e3o de permiss\u00e3o at\u00e9 a execu\u00e7\u00e3o da consulta:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">async executeQuery(userId, rawQuery, params = [])\r\n\u00a0 { try {\r\n\r\n\u00a0 \u00a0 \/\/Validate query for security\r\n\u00a0 \u00a0 QueryParser.validateQuery(rawQuery);\r\n\r\n\u00a0 \u00a0 \/\/Parse the query to get permission and resource\r\n\u00a0 \u00a0 const queryConfig = QueryParser.parseQuery(rawQuery)\r\n\u00a0 \u00a0 console.log('Parsed query config:', queryConfig);\r\n\u00a0 \u00a0 const permissionCheck = await this.checkQueryPermiss\r\n\r\n\u00a0 \u00a0 if (!permissionCheck.permitted) {\r\n\u00a0 \u00a0 \u00a0 return {\r\n\u00a0 \u00a0 \u00a0 \u00a0 status: 'not-permitted',\r\n\u00a0 \u00a0 \u00a0 \u00a0 error: `User ${userId} is not permitted to e \u00a0\r\n\u00a0 \u00a0 \u00a0 };\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 const options = { parameters: params };\r\n\u00a0 \u00a0 const result = await this.cluster.query(rawQuery,\r\n\u00a0 \u00a0 op return {\r\n\u00a0 \u00a0 \u00a0 status: 'permitted',\r\n\u00a0 \u00a0 \u00a0 success: true,\r\n\u00a0 \u00a0 \u00a0 results: result.rows,\r\n\u00a0 \u00a0 \u00a0 metadata: {\r\n\u00a0 \u00a0 \u00a0 \u00a0 metrics: result.metrics,\r\n\u00a0 \u00a0 \u00a0 \u00a0 profile: result.profile\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 };\r\n\u00a0 } catch (error) {\r\n\u00a0 \u00a0 \u00a0 console.error('Query execution error:', error);\r\n\u00a0 \u00a0 \u00a0 return {\r\n\u00a0 \u00a0 \u00a0 \u00a0 status: 'error',\r\n\u00a0 \u00a0 \u00a0 \u00a0 error: error.message\r\n\u00a0 \u00a0 };\r\n\u00a0 }\r\n}<\/pre>\n<h4><b>Ponto de extremidade da API<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">Por fim, expomos um endpoint de API para lidar com as consultas recebidas:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">\/\/ Route to handle SQL++ queries\r\napp.post('\/query', async (req, res) =&gt; {\r\n  const { userId, query, params } = req.body;\r\n\r\n  if (!userId || !query) {\r\n    return res.status(400).json({ error: 'userId and query a\r\n  }\r\n\r\n  try {\r\n    const result = await queryChecker.executeQuery(userId, q res.json(result);\r\n  } catch (error) {\r\n    res.status(500).json({ error: error.message }); \r\n  }\r\n});<\/pre>\n<p>&nbsp;<\/p>\n<h4><b>Conex\u00e3o com o Couchbase<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">Agora, definiremos o c\u00f3digo de conex\u00e3o do Couchbase em nosso servidor Express de backend, que nos ajuda a nos conectar ao cluster do Couchbase:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">\/\/ Connect to Couchbase cluster\r\n  async init() {\r\n    try {\r\n      this.cluster = await couchbase.connect(this.clusterC \r\n        username: this.username,\r\n        password: this.password,\r\n        configProfile: 'wanDevelopment',\r\n      });\r\n\r\n      this.bucket = this.cluster.bucket(this.bucketName); \r\n      this.collection = this.bucket.defaultCollection(); \r\n      console.log('Connected to Couchbase Capella');\r\n    } catch (error) {\r\n      console.error('Couchbase connection error:', error); \r\n      throw error;\r\n    }\r\n}<\/pre>\n<h3><span style=\"font-weight: 400;\">C\u00f3digo de front-end<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Para demonstrar a funcionalidade da integra\u00e7\u00e3o, criamos um frontend React simples que permite que os usu\u00e1rios insiram consultas e vejam os resultados.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para configura\u00e7\u00e3o, voc\u00ea pode verificar esse c\u00f3digo para os componentes da interface do usu\u00e1rio existentes:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">import React, { useState } from &#039;react&#039;;\r\nimport { Button } from &quot;@\/components\/ui\/button&quot;\r\nimport { Input } from &quot;@\/components\/ui\/input&quot;\r\nimport { Textarea } from &quot;@\/components\/ui\/textarea&quot;\r\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from &quot;@\/components\/ui\/card&quot;\r\nexport default function App() {\r\n  const [query, setQuery] = useState(&#039;&#039;);\r\n  const [user, setUser] = useState(&#039;&#039;);\r\n  const [result, setResult] = useState&lt;null | { success: boolean; results?: any[]; error?: string }&gt;(null);\r\n\r\n  const handleSubmit = async (e: React.FormEvent) =&gt; {\r\n    e.preventDefault();\r\n    try {\r\n      const response = await fetch(&#039;https:\/\/localhost:3001\/query&#039;, {\r\n        method: &#039;POST&#039;,\r\n        headers: {\r\n          &#039;Content-Type&#039;: &#039;application\/json&#039;,\r\n        },\r\n        body: JSON.stringify({ query, user }),\r\n      });\r\n      const data = await response.json();\r\n      setResult(data);\r\n    } catch (error) {\r\n      console.error(&#039;Error:&#039;, error);\r\n      setResult({ success: false, error: &#039;An error occurred while processing your request.&#039; });\r\n    }\r\n  };\r\n\r\n  return (\r\n    &lt;div classname=&quot;container mx-auto p-4&quot;&gt;\r\n      &lt;card classname=&quot;w-full max-w-2xl mx-auto&quot;&gt;\r\n        &lt;cardheader&gt;\r\n          &lt;cardtitle&gt;Permission Checker&lt;\/cardtitle&gt;\r\n          &lt;carddescription&gt;Enter a query and user to check permissions&lt;\/carddescription&gt;\r\n        &lt;\/cardheader&gt;\r\n        &lt;cardcontent&gt;\r\n          &lt;form onsubmit=&quot;{handleSubmit}&quot; classname=&quot;space-y-4&quot; action=&quot;&quot;&gt;\r\n            &lt;div&gt;\r\n              &lt;label htmlfor=&quot;query&quot; classname=&quot;block text-sm font-medium text-gray-700&quot;&gt;Consulta&lt;\/label&gt;\r\n              &lt;textarea\r\n                id=&quot;query&quot;\r\n                value=&quot;{query}&quot;                onchange=&quot;{(e)&quot; &gt; setQuery(e.target.value)}\r\n                placeholder=&quot;Enter your SQL++ query here&quot;\r\n                className=&quot;mt-1&quot;\r\n                rows={4}\r\n              \/&gt;\r\n            &lt;\/div&gt;\r\n            &lt;div&gt;\r\n              &lt;label htmlfor=&quot;user&quot; classname=&quot;block text-sm font-medium text-gray-700&quot;&gt;Usu&aacute;rio&lt;\/label&gt;\r\n              &lt;input\r\n                id=&quot;user&quot;\r\n                type=&quot;text&quot;\r\n                value=&quot;{user}&quot;                onchange=&quot;{(e)&quot; &gt; setUser(e.target.value)}\r\n                placeholder=&quot;Enter user email&quot;\r\n                className=&quot;mt-1&quot;\r\n              \/&gt;\r\n            &lt;\/div&gt;\r\n            &lt;button type=&quot;submit&quot; classname=&quot;w-full&quot;&gt;Verificar permiss&otilde;es&lt;\/button&gt;\r\n          &lt;input type=&quot;hidden&quot; name=&quot;trp-form-language&quot; value=&quot;pt&quot;\/&gt;&lt;\/form&gt;\r\n        &lt;\/cardcontent&gt;\r\n        &lt;cardfooter&gt;\r\n          {result &amp;&amp; (\r\n            &lt;div classname=&quot;{`mt-4&quot; p-4 rounded ${result.success ? &#039;bg-green-100&#039; : &#039;bg-red-100&#039;}`}&gt;\r\n              {result.success ? (\r\n                &lt;div&gt;\r\n                  &lt;h3 classname=&quot;font-bold text-green-800&quot;&gt;Permission Granted&lt;\/h3&gt;\r\n                  &lt;pre classname=&quot;mt-2 whitespace-pre-wrap&quot;&gt;{JSON.stringify(result.results, null, 2)}&lt;\/pre&gt;\r\n                &lt;\/div&gt;\r\n              ) : (\r\n                &lt;div&gt;\r\n                  &lt;h3 classname=&quot;font-bold text-red-800&quot;&gt;Permission Denied&lt;\/h3&gt;\r\n                  &lt;p&gt;{result.error}&lt;\/p&gt;\r\n                &lt;\/div&gt;\r\n              )}\r\n            &lt;\/div&gt;\r\n          )}\r\n        &lt;\/cardfooter&gt;\r\n      &lt;\/card&gt;\r\n    &lt;\/div&gt;\r\n  );\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">Esse componente React permite que os usu\u00e1rios insiram uma consulta e seu identificador de usu\u00e1rio e, em seguida, exibe os resultados ou quaisquer erros relacionados \u00e0 permiss\u00e3o.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para obter o c\u00f3digo completo, consulte o <\/span><a href=\"https:\/\/github.com\/Arindam200\/permit-couchbase\"><span style=\"font-weight: 400;\">Permiss\u00e3o-Demo<\/span><\/a><span style=\"font-weight: 400;\"> Reposit\u00f3rio do GitHub.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Demonstra\u00e7\u00e3o<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Com tudo pronto, voc\u00ea pode executar o servidor Express de backend e o aplicativo React separadamente. Quando ambos estiverem em execu\u00e7\u00e3o, voc\u00ea ver\u00e1 uma interface do usu\u00e1rio como a mostrada abaixo. Adicione a consulta e o usu\u00e1rio correspondente e, em seguida, clique no bot\u00e3o <\/span><b>Verificar permiss\u00f5es<\/b><span style=\"font-weight: 400;\"> bot\u00e3o.<\/span><\/p>\n<div id=\"attachment_16738\" style=\"width: 910px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/prod-files-secure.s3.us-west-2.amazonaws.com\/990b93c0-b79d-4%20965-a17f-a8c192093951\/1452ba19-4cc7-42f8-a8ca-ae50f0f14429\/permit_%20(online-video-cutter.com).mp4\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-16738\" class=\"wp-image-16738 size-large\" style=\"border: 1px black solid;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/Screenshot-2025-01-01-at-10.55.49\u202fPM-1024x607.png\" alt=\"\" width=\"900\" height=\"533\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/Screenshot-2025-01-01-at-10.55.49\u202fPM-1024x607.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/Screenshot-2025-01-01-at-10.55.49\u202fPM-300x178.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/Screenshot-2025-01-01-at-10.55.49\u202fPM-768x455.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/Screenshot-2025-01-01-at-10.55.49\u202fPM-1536x911.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/Screenshot-2025-01-01-at-10.55.49\u202fPM-2048x1214.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/Screenshot-2025-01-01-at-10.55.49\u202fPM-1320x783.png 1320w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><p id=\"caption-attachment-16738\" class=\"wp-caption-text\">Clique na imagem para abrir o v\u00eddeo de demonstra\u00e7\u00e3o<\/p><\/div>\n<p><span style=\"font-weight: 400;\">No exemplo acima, voc\u00ea pode ver o usu\u00e1rio que tem permiss\u00e3o e o usu\u00e1rio que n\u00e3o tem permiss\u00e3o para acessar o recurso.<\/span><\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p><span style=\"font-weight: 400;\">Neste tutorial, exploramos como definir e configurar o Permit para adicionar configura\u00e7\u00f5es de RBAC ao conjunto de dados de amostra de viagens do Couchbase e como verificar as permiss\u00f5es de uma determinada consulta SQL++.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">E se voc\u00ea quiser um n\u00edvel de controle mais granular do que as fun\u00e7\u00f5es de usu\u00e1rio, concentrando-se em identidades espec\u00edficas do usu\u00e1rio? Para isso e muito mais, recomendamos que continue explorando nossos materiais de aprendizagem, como <\/span><a href=\"https:\/\/www.permit.io\/blog\/rbac-vs-abac\"><b>A diferen\u00e7a entre RBAC e ABAC<\/b> <\/a><span style=\"font-weight: 400;\">e <\/span><a href=\"https:\/\/www.permit.io\/abac\"><b>adicionar o ABAC ao seu aplicativo com o Permit<\/b><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Deseja saber mais sobre a implementa\u00e7\u00e3o da autoriza\u00e7\u00e3o? Tem d\u00favidas? Entre em contato\u00a0<\/span><span style=\"font-weight: 400;\">para n\u00f3s em nossa <\/span><a href=\"https:\/\/io.permit.io\/permitslack\"><b>Comunidade do Slack<\/b><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>As web applications grow in complexity, ensuring that only the right users have access to your Couchbase data is essential. Without a well-defined access control system, unauthorized users may access sensitive information or perform harmful actions. Integrating Permit with Couchbase [&hellip;]<\/p>","protected":false},"author":85559,"featured_media":16739,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,3917,2242,2225,9921,1813],"tags":[10070,1903,1962],"ppma_author":[10069],"class_list":["post-16726","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-company","category-connectors","category-cloud","category-partners","category-security","tag-permit-io","tag-rbac","tag-role-based-access-control"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Adding External RBAC to Couchbase Data Using Permit.io - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Discover how to secure Couchbase data with Permit.io and implement fine-grained role-based access control (RBAC) for your applications.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/permit-io-couchbase-access-control\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Adding External RBAC to Couchbase Data Using Permit.io\" \/>\n<meta property=\"og:description\" content=\"Discover how to secure Couchbase data with Permit.io and implement fine-grained role-based access control (RBAC) for your applications.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/permit-io-couchbase-access-control\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-02T06:07:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-16T17:43:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-permitio-rbac-couchbase.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Shivay Lamba, Developer Evangelist\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Shivay Lamba, Developer Evangelist\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/\"},\"author\":{\"name\":\"Shivay Lamba, Developer Evangelist\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/377d9b772c90439916236da79c02c418\"},\"headline\":\"Adding External RBAC to Couchbase Data Using Permit.io\",\"datePublished\":\"2025-01-02T06:07:24+00:00\",\"dateModified\":\"2025-06-16T17:43:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/\"},\"wordCount\":1534,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-permitio-rbac-couchbase.png\",\"keywords\":[\"permit.io\",\"RBAC\",\"Role Based Access Control (RBAC)\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Company\",\"Connectors\",\"Couchbase Capella\",\"Partners\",\"Security\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/\",\"name\":\"Adding External RBAC to Couchbase Data Using Permit.io - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-permitio-rbac-couchbase.png\",\"datePublished\":\"2025-01-02T06:07:24+00:00\",\"dateModified\":\"2025-06-16T17:43:35+00:00\",\"description\":\"Discover how to secure Couchbase data with Permit.io and implement fine-grained role-based access control (RBAC) for your applications.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-permitio-rbac-couchbase.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-permitio-rbac-couchbase.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Adding External RBAC to Couchbase Data Using Permit.io\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/377d9b772c90439916236da79c02c418\",\"name\":\"Shivay Lamba, Developer Evangelist\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/7b5e7cd8007bd40de81c1ef6a9e0266f\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/shivay-lambda-couchbase.jpeg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/shivay-lambda-couchbase.jpeg\",\"caption\":\"Shivay Lamba, Developer Evangelist\"},\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/shivaylambda\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Adding External RBAC to Couchbase Data Using Permit.io - The Couchbase Blog","description":"Descubra como proteger os dados do Couchbase com o Permit.io e implementar o controle de acesso baseado em fun\u00e7\u00e3o (RBAC) refinado para seus aplicativos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/permit-io-couchbase-access-control\/","og_locale":"pt_BR","og_type":"article","og_title":"Adding External RBAC to Couchbase Data Using Permit.io","og_description":"Discover how to secure Couchbase data with Permit.io and implement fine-grained role-based access control (RBAC) for your applications.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/permit-io-couchbase-access-control\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-01-02T06:07:24+00:00","article_modified_time":"2025-06-16T17:43:35+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-permitio-rbac-couchbase.png","type":"image\/png"}],"author":"Shivay Lamba, Developer Evangelist","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Shivay Lamba, Developer Evangelist","Est. reading time":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/"},"author":{"name":"Shivay Lamba, Developer Evangelist","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/377d9b772c90439916236da79c02c418"},"headline":"Adding External RBAC to Couchbase Data Using Permit.io","datePublished":"2025-01-02T06:07:24+00:00","dateModified":"2025-06-16T17:43:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/"},"wordCount":1534,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-permitio-rbac-couchbase.png","keywords":["permit.io","RBAC","Role Based Access Control (RBAC)"],"articleSection":["Best Practices and Tutorials","Company","Connectors","Couchbase Capella","Partners","Security"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/","url":"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/","name":"Adding External RBAC to Couchbase Data Using Permit.io - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-permitio-rbac-couchbase.png","datePublished":"2025-01-02T06:07:24+00:00","dateModified":"2025-06-16T17:43:35+00:00","description":"Descubra como proteger os dados do Couchbase com o Permit.io e implementar o controle de acesso baseado em fun\u00e7\u00e3o (RBAC) refinado para seus aplicativos.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-permitio-rbac-couchbase.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-permitio-rbac-couchbase.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/permit-io-couchbase-access-control\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Adding External RBAC to Couchbase Data Using Permit.io"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/377d9b772c90439916236da79c02c418","name":"Shivay Lamba, desenvolvedor evangelista","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/7b5e7cd8007bd40de81c1ef6a9e0266f","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/shivay-lambda-couchbase.jpeg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/shivay-lambda-couchbase.jpeg","caption":"Shivay Lamba, Developer Evangelist"},"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/shivaylambda\/"}]}},"authors":[{"term_id":10069,"user_id":85559,"is_guest":0,"slug":"shivaylambda","display_name":"Shivay Lamba, Developer Evangelist","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/shivay-lambda-couchbase.jpeg","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/shivay-lambda-couchbase.jpeg"},"author_category":"","last_name":"Lamba, Developer Evangelist","first_name":"Shivay","job_title":"","user_url":"","description":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/16726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/85559"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=16726"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/16726\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/16739"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=16726"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=16726"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=16726"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=16726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}