{"id":2123,"date":"2016-01-13T21:37:07","date_gmt":"2016-01-13T21:37:06","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2123"},"modified":"2020-11-12T12:45:02","modified_gmt":"2020-11-12T20:45:02","slug":"augment-your-sync-function-with-roles-in-couchbase-sync-gateway","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/","title":{"rendered":"Aumenta tu funci\u00f3n de sincronizaci\u00f3n con roles en Couchbase Sync Gateway"},"content":{"rendered":"<p>Los roles en Sync Gateway a menudo se pasan por alto porque parecen m\u00e1s complejos de usar que los usuarios y los canales. Sin embargo, proporcionan una capa adicional de abstracci\u00f3n y pueden simplificar enormemente su modelo de datos. Tomemos el ejemplo de una aplicaci\u00f3n para compartir rese\u00f1as de restaurantes por ciudades. Diferentes usuarios podr\u00edan tener diferentes privilegios como moderadores y usuarios invitados. En este tutorial, configurar\u00e1 el <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.1.0\/develop\/guides\/sync-gateway\/sync-function-api-guide\/index.html\">Funci\u00f3n de sincronizaci\u00f3n<\/a> para permitir que los usuarios autenticados de dicha aplicaci\u00f3n aprueben, publiquen revisiones o asignen funciones a otros usuarios.<\/p>\n<p>En total, habr\u00e1 3 tipos de funciones en la aplicaci\u00f3n:<\/p>\n<ul>\n<li><strong>nivel 1<\/strong>: usuarios con el <strong>nivel 1<\/strong> pueden publicar rese\u00f1as, pero deben ser aceptadas por usuarios con el rol <strong>nivel 3<\/strong> (es decir, moderadores) sea p\u00fablica.<\/li>\n<li><strong>nivel 2<\/strong>: los usuarios pueden publicar comentarios sin necesidad de validaci\u00f3n por parte de los moderadores. Esto significa que pueden publicar un comentario sin necesidad de aprobaci\u00f3n.<\/li>\n<li><strong>nivel 3<\/strong>Los usuarios pueden aprobar o rechazar las opiniones.<\/li>\n<\/ul>\n<h2 id=\"toc_1\">Descargar Sync Gateway<\/h2>\n<p>Descargue Sync Gateway y descomprima el archivo:<\/p>\n<blockquote><p>https:\/\/www.couchbase.com\/downloads?family=sync-gateway<\/p><\/blockquote>\n<p>Encontrar\u00e1 el binario Sync Gateway en la carpeta <code>papelera<\/code> y ejemplos de archivos de configuraci\u00f3n en la carpeta <code>ejemplos<\/code> carpeta. Copie la carpeta <code>usuarios-role.json<\/code> en la ra\u00edz del proyecto:<\/p>\n<pre><code class=\"language-bash\">cp ~\/Downloads\/couchbase-sync-gateway\/examples\/users-roles.json \/path\/to\/proj\/sync-gateway-config.json<\/code><\/pre>\n<p>En la siguiente secci\u00f3n, actualizar\u00e1s el archivo de configuraci\u00f3n para crear usuarios y roles.<\/p>\n<h2 id=\"toc_2\">Editar el archivo de configuraci\u00f3n<\/h2>\n<p>En <code>sync-gateway-config.json<\/code>actualiza el objeto db a leer:<\/p>\n<pre><code class=\"language-javascript\">{\r\n  \"log\": [\"*\"],\r\n  \"databases\": {\r\n    \"db\": {\r\n      \"server\": \"walrus:\",\r\n      \"users\": {\r\n        \"jens\": {\r\n          \"admin_roles\": [\"level-1\"],\r\n          \"password\": \"letmein\"\r\n        },\r\n        \"andy\": {\r\n          \"admin_roles\": [\"level-2\"],\r\n          \"password\": \"letmein\"\r\n        },\r\n        \"william\": {\r\n          \"admin_roles\": [],\r\n          \"password\": \"letmein\"\r\n        },\r\n        \"traun\": {\r\n          \"admin_roles\": [\"level-3\"],\r\n          \"password\": \"letmein\"\r\n        }\r\n      },\r\n      \"roles\": {\r\n        \"level-1\": {},\r\n        \"level-2\": {},\r\n        \"level-3\": {}\r\n      },\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p>Arriba est\u00e1n pasando un par de cosas:<\/p>\n<ol>\n<li>Se crea el usuario <code>jens<\/code> con el <code>nivel 1<\/code> papel.<\/li>\n<li>Se crea el usuario <code>andy<\/code> con el <code>nivel 2<\/code> papel.<\/li>\n<li>Se crea el usuario <code>william<\/code> sin ning\u00fan papel.<\/li>\n<li>Se crea el usuario <code>traun<\/code> con el <code>nivel 3<\/code> papel.<\/li>\n<li>Usted define los 3 roles. Al igual que los usuarios, los roles deben crearse expl\u00edcitamente en la API REST de Admin o en el archivo de configuraci\u00f3n.<\/li>\n<\/ol>\n<p><strong>Nota sobre la creaci\u00f3n de roles<\/strong><\/p>\n<p>La forma m\u00e1s f\u00e1cil de crear roles es en el archivo de configuraci\u00f3n como se hizo anteriormente.<\/p>\n<p>Otra forma de crear roles es a trav\u00e9s de la API REST del administrador. Siempre que exponga un punto final para crear esos roles desde la aplicaci\u00f3n, puede crear roles din\u00e1micamente enviando una solicitud al servidor de su aplicaci\u00f3n (flechas azules), que crear\u00e1 el rol y devolver\u00e1 un 201 Creado si ha tenido \u00e9xito (flechas verdes).<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/january\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/diagram.png\" \/><\/p>\n<p>En la siguiente secci\u00f3n, a\u00f1adir\u00e1 la funci\u00f3n de sincronizaci\u00f3n para gestionar las operaciones de escritura y lectura de los tres tipos diferentes de documentos (<code>restaurante<\/code>, <code>revise<\/code>, <code>perfil<\/code>).<\/p>\n<h2 id=\"toc_3\">A\u00f1adir la funci\u00f3n de sincronizaci\u00f3n<\/h2>\n<p><a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.1.0\/develop\/guides\/sync-gateway\/sync-function-api-guide\/routing\/index.html#role\">Funciones<\/a> y <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.1.0\/develop\/guides\/sync-gateway\/sync-function-api-guide\/routing\/index.html#access\">usuarios<\/a> pueden tener acceso a <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.1.0\/develop\/guides\/sync-gateway\/sync-function-api-guide\/routing\/index.html#channel\">canales<\/a>. A los usuarios se les pueden otorgar roles, y heredar cualquier acceso al canal para esos roles.<\/p>\n<p>El acceso al canal determina la seguridad de lectura de un usuario. La seguridad de escritura tambi\u00e9n puede basarse en canales (utilizando <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.1.0\/develop\/guides\/sync-gateway\/sync-function-api-guide\/validation\/index.html#require-access\">requireAccess<\/a>), pero tambi\u00e9n puede basarse en el usuario\/rol (<a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.1.0\/develop\/guides\/sync-gateway\/sync-function-api-guide\/validation\/index.html#require-user\">requerirUsuario<\/a> y <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.1.0\/develop\/guides\/sync-gateway\/sync-function-api-guide\/validation\/index.html#require-role\">requireRole<\/a>), o el contenido del documento (mediante <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.1.0\/develop\/guides\/sync-gateway\/sync-function-api-guide\/validation\/index.html#throw\">tirar<\/a>).<\/p>\n<p>El acceso de lectura y escritura a los documentos es independiente. De hecho, el acceso de escritura est\u00e1 totalmente gobernado por su funci\u00f3n de sincronizaci\u00f3n: a menos que la funci\u00f3n de sincronizaci\u00f3n rechace la revisi\u00f3n, un cliente puede modificar cualquier documento. Todas las funciones require* act\u00faan como validadores, pero tambi\u00e9n como API de acceso a la escritura.<\/p>\n<p>Es muy com\u00fan ver que la funci\u00f3n de sincronizaci\u00f3n crea montones y montones de canales. Esto est\u00e1 muy bien. Sin embargo, puede resultar engorroso asignar cada usuario a un canal. En su lugar, puedes utilizar un rol.<\/p>\n<p>Deja que esto se hunda una vez m\u00e1s, a los usuarios se les pueden conceder roles y heredar cualquier acceso al canal para esos roles.<\/p>\n<p>Esto significa que puedes conceder a un usuario acceso a m\u00faltiples canales simplemente asign\u00e1ndole un rol. Esto es muy potente porque no necesitas asignar cada usuario a un canal. Basta con conceder a la funci\u00f3n acceso al canal y asignar los usuarios a la funci\u00f3n.<\/p>\n<p>Teniendo esto en cuenta, sustituye la funci\u00f3n de sincronizaci\u00f3n en <code>sync-gateway-config.json<\/code>:<\/p>\n<pre><code class=\"language-javascript\">function(doc, oldDoc) {\r\n  if (doc.type == \"restaurant\"){\r\n    channel(doc.restaurant_id);\r\n  } else if (doc.type == \"review\") {\r\n    switch(doc.role) {\r\n      case \"level-1\": \/\/ Step 1\r\n        requireRole(doc.role);\r\n        var channelname = doc.owner + \"-in-review\";\r\n        channel(channelname);\r\n        access(doc.owner, channelname);\r\n        access(\"role:level-3\", channelname);\r\n        break;\r\n    case \"level-2\": \/\/ Step 2\r\n      requireRole(doc.role);\r\n      channel(doc.restaurant_id);\r\n      break;\r\n    case \"level-3\": \/\/ Step 3\r\n      requireRole(doc.role);\r\n      channel(doc.restaurant_id);\r\n      break;\r\n    }\r\n  } else if (doc.type == \"profile\") {\r\n    requireRole(\"level-3\");\r\n    role(doc.name, \"role:\" + doc.role);\r\n  }\r\n}<\/code><\/pre>\n<p>Esto es lo que ocurre:<\/p>\n<ol>\n<li>Los usuarios con el <strong>nivel 1<\/strong> tiene acceso de escritura porque llama al rol <code>canal<\/code> funci\u00f3n. A continuaci\u00f3n, conceda a ese usuario y al <strong>nivel 3<\/strong> acceso a este canal. Aqu\u00ed es donde el poder de los roles realmente brilla. Al otorgar acceso a un rol, est\u00e1s otorgando acceso al canal a todos los usuarios con ese rol. La llamada a <code>requireRole<\/code> conceder\u00e1 el permiso de escritura.<\/li>\n<li>Documentos de tipo <code>revise<\/code> creado por un <strong>nivel 2<\/strong> rol: el documento debe ir en el mismo canal que el restaurante al que pertenece. La llamada a <code>requireRole<\/code> conceder\u00e1 el permiso de escritura.<\/li>\n<li>Documentos de tipo <code>revise<\/code> creado por un <strong>nivel 3<\/strong> funci\u00f3n: el documento debe ir en el canal correspondiente a ese restaurante. <strong>nivel 3<\/strong> tambi\u00e9n tienen acceso de lectura a todos los <code>{nombre_usuario}-en-revisi\u00f3n<\/code> canales. Pueden aprobar\/rechazar las revisiones pendientes de otros usuarios.<\/li>\n<\/ol>\n<p>Inicie Sync Gateway con el archivo de configuraci\u00f3n actualizado:<\/p>\n<pre><code class=\"language-bash\">$ ~\/Downloads\/couchbase-sync-gateway\/bin\/sync_gateway \/path\/to\/proj\/sync-gateway-config.json<\/code><\/pre>\n<p>En este ejemplo, est\u00e1 utilizando las 3 caracter\u00edsticas principales de los roles:<\/p>\n<ul>\n<li>Conceder a un rol acceso a un canal e indirectamente a todos los usuarios con ese rol.<\/li>\n<li>Concesi\u00f3n de permisos de escritura mediante un requireRole.<\/li>\n<li>Asignar un rol a un usuario.<\/li>\n<\/ul>\n<p>Ahora puede probar que la Funci\u00f3n de Sincronizaci\u00f3n se comporta como se espera con las siguientes peticiones HTTP.<\/p>\n<h2 id=\"toc_4\">Ejecuci\u00f3n de diferentes escenarios<\/h2>\n<p><strong>Escenario 1<\/strong><\/p>\n<p>Documentos de tipo <code>revise<\/code> creado por un <strong>nivel 1<\/strong> usuario: el documento debe ir en el <code>{nombre_usuario}-en-revisi\u00f3n<\/code> y los usuarios con el <strong>nivel 3<\/strong> papel tambi\u00e9n deber\u00eda tener acceso a este canal.<\/p>\n<p>Iniciar sesi\u00f3n como usuario <code>jens<\/code>:<\/p>\n<pre><code class=\"language-bash\">curl -vX POST -H 'Content-Type: application\/json' \r\n     :4984\/db\/_session \r\n     -d '{\"name\": \"jens\", \"password\": \"letmein\"}'\r\n     \r\n&gt; POST \/db\/_session HTTP\/1.1\r\n&gt; User-Agent: curl\/7.37.1\r\n&gt; Host: :4984\r\n&gt; Accept: *\/*\r\n&gt; Content-Type: application\/json\r\n&gt; Content-Length: 39\r\n&gt; \r\n* upload completely sent off: 39 out of 39 bytes\r\n&lt; HTTP\/1.1 200 OK\r\n&lt; Content-Length: 103\r\n&lt; Content-Type: application\/json\r\n* Server Couchbase Sync Gateway\/1.1.0 is not blacklisted\r\n&lt; Server: Couchbase Sync Gateway\/1.1.0\r\n&lt; Set-Cookie: SyncGatewaySession=6c52b8cd2c706d55e97d9606058c0abd90a5d200; Path=\/db\/; Expires=Tue, 07 Jul 2015 08:23:03 UTC\r\n&lt; Date: Mon, 06 Jul 2015 08:23:03 GMT\r\n&lt; \r\n* Connection #0 to host  left intact\r\n{\"authentication_handlers\":[\"default\",\"cookie\"],\"ok\":true,\"userCtx\":{\"channels\":{\"!\":1},\"name\":\"jens\"}}\u23ce                                                                            <\/code><\/pre>\n<p>Guardar un nuevo documento de tipo <code>revise<\/code> (sustituya el token por el devuelto en la funci\u00f3n <code>Set-Cookie<\/code> encabezamiento anterior):<\/p>\n<pre><code class=\"language-bash\">curl -vX POST -H 'Content-Type: application\/json' \r\n     --cookie 'SyncGatewaySession=d007ceb561f0111512c128040c32c02ea9d90234' \r\n     :4984\/db\/ \r\n     -d '{\"type\": \"review\", \"role\": \"level-1\", \"owner\": \"jens\"}'<\/code><\/pre>\n<ul>\n<li>Compruebe que el usuario <code>jens<\/code> tiene acceso al canal <code>jens-en-revisi\u00f3n<\/code> y el documento de comentarios est\u00e1 ah\u00ed.<img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/january\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/level-1.png\" \/><\/li>\n<li>Compruebe que el usuario <code>traun<\/code> tiene acceso al canal <code>jens-en-revisi\u00f3n<\/code>.<img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/january\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/level-3.png\" \/><\/li>\n<\/ul>\n<p>Tambi\u00e9n puede ver los canales a los que pertenece este documento y los roles\/usuarios que tienen acceso a \u00e9l en la secci\u00f3n <code>Documentos<\/code> ficha:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/january\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/doc-jens.png\" \/><\/p>\n<p><strong>Escenario 2<\/strong><\/p>\n<p>Conceder acceso de escritura mediante un rol.<\/p>\n<p>Iniciar sesi\u00f3n como <code>andy<\/code> y sustituye el token por el que recibiste de la solicitud de inicio de sesi\u00f3n.<\/p>\n<pre><code class=\"language-bash\">curl -vX POST -H 'Content-Type: application\/json' \r\n              --cookie 'SyncGatewaySession=6e7ce145ae53c83de436b47ae37d8d94beebebea' \r\n              :4984\/db\/ \r\n              -d '{\"type\": \"review\", \"role\": \"level-2\", \"owner\": \"andy\", \"restaurant_id\": \"123\"}'<\/code><\/pre>\n<ul>\n<li>Compruebe que el comentario se ha a\u00f1adido al canal del restaurante (denominado <code>123<\/code> en este ejemplo).<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/january\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/doc-andy.png\" \/><\/p>\n<p><strong>Escenario 3<\/strong><\/p>\n<p>Asignar un rol a un usuario.<\/p>\n<p>Iniciar sesi\u00f3n como <code>traun<\/code> y sustituye el token por el que recibiste de la solicitud de inicio de sesi\u00f3n.<\/p>\n<pre><code class=\"language-bash\">curl -vX POST -H 'Content-Type: application\/json' \r\n              --cookie 'SyncGatewaySession=3a5c5a67ff67643f8ade175363c65354584429e9' \r\n              :4984\/db\/ \r\n              -d '{\"type\": \"profile\", \"name\": \"william\", \"role\": \"level-3\"}'<\/code><\/pre>\n<ul>\n<li>Compruebe que <code>william<\/code> tiene papel <code>nivel 3<\/code>.<\/li>\n<li>Compruebe que <code>william<\/code> tiene acceso al <code>jens-en-revisi\u00f3n<\/code> canal.<img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/january\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/user-william.png\" \/><\/li>\n<\/ul>\n<h2 id=\"toc_5\">Conclusi\u00f3n<\/h2>\n<p>En este tutorial, aprendiste a usar canales y requireRole para validar y realizar operaciones de escritura din\u00e1micamente. Tambi\u00e9n asignaste m\u00faltiples canales a la vez a m\u00faltiples usuarios usando la API de roles.<\/p>","protected":false},"excerpt":{"rendered":"<p>Roles in Sync Gateway are often overlooked because they seem more complex to use than Users and Channels. However, they provide one additional layer of abstraction and can greatly simplify your data model. Take the example of an application to [&hellip;]<\/p>","protected":false},"author":51,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1810],"tags":[],"ppma_author":[9028],"class_list":["post-2123","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile"],"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>Augment Sync Function with Roles in Couchbase Sync Gateway<\/title>\n<meta name=\"description\" content=\"See how to configure the Sync Function to allow authenticated users of such an application to approve, post reviews or assign roles to other users.\" \/>\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\/es\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Augment your Sync Function with Roles in Couchbase Sync Gateway\" \/>\n<meta property=\"og:description\" content=\"See how to configure the Sync Function to allow authenticated users of such an application to approve, post reviews or assign roles to other users.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-13T21:37:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-11-12T20:45:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"James Nocentini, Technical Writer, Mobile, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"James Nocentini, Technical Writer, Mobile, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/\"},\"author\":{\"name\":\"James Nocentini, Technical Writer, Mobile, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ec4dfbd349cb4a321fb6a92b71a9a7f6\"},\"headline\":\"Augment your Sync Function with Roles in Couchbase Sync Gateway\",\"datePublished\":\"2016-01-13T21:37:06+00:00\",\"dateModified\":\"2020-11-12T20:45:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/\"},\"wordCount\":1005,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Couchbase Mobile\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/\",\"name\":\"Augment Sync Function with Roles in Couchbase Sync Gateway\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-01-13T21:37:06+00:00\",\"dateModified\":\"2020-11-12T20:45:02+00:00\",\"description\":\"See how to configure the Sync Function to allow authenticated users of such an application to approve, post reviews or assign roles to other users.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Augment your Sync Function with Roles in Couchbase Sync Gateway\"}]},{\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\/ec4dfbd349cb4a321fb6a92b71a9a7f6\",\"name\":\"James Nocentini, Technical Writer, Mobile, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/09977bdd14473dc23a125f2f74c3e816\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g\",\"caption\":\"James Nocentini, Technical Writer, Mobile, Couchbase\"},\"description\":\"James Nocentini is the Technical Writer in charge of the documentation for Couchbase Mobile. Previously, he worked as a Developer Advocate and before that as a front-end developer for HouseTrip. He also enjoys writing Android tutorials for raywenderlich.com in his spare time.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/james-nocentini\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Augment Sync Function with Roles in Couchbase Sync Gateway","description":"See how to configure the Sync Function to allow authenticated users of such an application to approve, post reviews or assign roles to other users.","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\/es\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/","og_locale":"es_MX","og_type":"article","og_title":"Augment your Sync Function with Roles in Couchbase Sync Gateway","og_description":"See how to configure the Sync Function to allow authenticated users of such an application to approve, post reviews or assign roles to other users.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-01-13T21:37:06+00:00","article_modified_time":"2020-11-12T20:45:02+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"James Nocentini, Technical Writer, Mobile, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"James Nocentini, Technical Writer, Mobile, Couchbase","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/"},"author":{"name":"James Nocentini, Technical Writer, Mobile, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ec4dfbd349cb4a321fb6a92b71a9a7f6"},"headline":"Augment your Sync Function with Roles in Couchbase Sync Gateway","datePublished":"2016-01-13T21:37:06+00:00","dateModified":"2020-11-12T20:45:02+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/"},"wordCount":1005,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Couchbase Mobile"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/","url":"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/","name":"Augment Sync Function with Roles in Couchbase Sync Gateway","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-01-13T21:37:06+00:00","dateModified":"2020-11-12T20:45:02+00:00","description":"See how to configure the Sync Function to allow authenticated users of such an application to approve, post reviews or assign roles to other users.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/augment-your-sync-function-with-roles-in-couchbase-sync-gateway\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Augment your Sync Function with Roles in Couchbase Sync Gateway"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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\/ec4dfbd349cb4a321fb6a92b71a9a7f6","name":"James Nocentini, Redactor t\u00e9cnico, M\u00f3vil, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/09977bdd14473dc23a125f2f74c3e816","url":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","caption":"James Nocentini, Technical Writer, Mobile, Couchbase"},"description":"James Nocentini es el escritor t\u00e9cnico encargado de la documentaci\u00f3n de Couchbase Mobile. Anteriormente, trabaj\u00f3 como Developer Advocate y antes de eso como desarrollador front-end para HouseTrip. Tambi\u00e9n disfruta escribiendo tutoriales de Android para raywenderlich.com en su tiempo libre.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/james-nocentini\/"}]}},"authors":[{"term_id":9028,"user_id":51,"is_guest":0,"slug":"james-nocentini","display_name":"James Nocentini, Technical Writer, Mobile, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","author_category":"","last_name":"Nocentini","first_name":"James","job_title":"","user_url":"","description":"James Nocentini es el escritor t\u00e9cnico encargado de la documentaci\u00f3n de Couchbase Mobile. Anteriormente, trabaj\u00f3 como Developer Advocate y antes de eso como desarrollador front-end para HouseTrip. Tambi\u00e9n disfruta escribiendo tutoriales de Android para raywenderlich.com en su tiempo libre."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/51"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2123"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2123\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2123"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}