Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

262
Vistas
PostgreSQL + Rails: ¿es posible tener un usuario de base de datos de solo escritura en PG?

Estoy creando una API JSON en Ruby on Rails. Quiero tener cuentas de usuario de solo escritura que se supone que alimentan datos al sistema pero que no deberían poder leer de él.

Para lograr una capa adicional de seguridad, me gustaría aplicar esta regla en el nivel de la base de datos.

La idea es tener un tipo de usuario "escritor" que use una conexión separada a la base de datos. A esta conexión se le debe permitir insertar/actualizar/eliminar pero no seleccionar.

Tengo todo configurado muy bien, pero desafortunadamente Rails genera esta consulta al insertar:

 INSERT INTO "default"."products" ("id", "name", "sku") VALUES ($1, $2, $3) RETURNING "id"

La parte "ID DE RETORNO" está haciendo que falle porque el usuario no tiene permisos SELECCIONAR:

 ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR: permission denied for relation products: INSERT INTO "default"."products" ("id", "name", "sku") VALUES ($1, $2, $3) RETURNING "id"

¿Hay alguna forma de evitar esto en PG o Rails? Las dos opciones que veo son:

  1. Otorgar un permiso SELECT "limitado" a los usuarios escritores en PG, para que solo puedan "ver" algunas columnas. No sé si esto es posible en absoluto.
  2. Conseguir que Rails no agregue ese "ID DE RETORNO" al final de la consulta, aunque esto podría tener efectos secundarios.

Encontré un artículo de alguien que tuvo el mismo problema y terminé simplemente otorgando derechos SELECT a los usuarios escritores:

https://til.hashrocket.com/posts/0c83645c03-postgres-permisos-para-insertar-pero-no-devolver

¿Hay alguna posibilidad de que haya una solución real para que la configuración anterior funcione?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Hay una forma de usar la función de seguridad de nivel de fila disponible desde PostgreSQL 9.5:

 create table products(id serial primary key, name text not null, sku text not null); grant select,insert on products to tometzky; grant usage on sequence products_id_seq to tometzky; alter table products enable row level security; create policy products_tometzky on products to tometzky using (id=currval('products_id_seq')); tometzky=> select * from products; ERROR: currval of sequence "products_id_seq" is not yet defined in this session tometzky=> insert into products (name, sku) values ('a','a') returning id; 1 tometzky=> select * from products; 1|a|a tometzky=> insert into products (name, sku) values ('b','b') returning id; 2 tometzky=> select * from products; 2|b|b

Un usuario solo ve la última fila que puso en la base de datos. Él sabe lo que es de todos modos.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda