Estoy un poco confundido sobre la configuración de permisos en PostgreSQL.
Tengo estos roles:
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
admin | Superuser, Create role, Create DB, Replication | {}
meltemi | Create role, Create DB | {rails}
rails | Create DB, Cannot login | {}
myapp | | {rails}
y bases de datos:
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------------+--------+----------+-------------+-------------+-------------------
myapp_production | rails | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
...
el usuario myapp
no tiene problemas para consultar la myapp_production
base de datos agregando y eliminando registros. También me gustaría meltemi
poder consultar la misma base de datos. Por lo tanto, he creado un papel rails
que posee la base de datos y de hecho tanto meltemi
y myapp
miembros de rails
. Pero sigo teniendo permission denied for relation
errores. Meltemi
puede ver el esquema pero no puede consultar la base de datos.
Acabo de notar (con \dt
comando) que myapp
es el propietario de las tablas:
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+-------
public | events | table | myapp
public | schema_migrations | table | myapp
...
public | users | table | myapp
...
Las tablas se crearon a través de un ORM (migraciones ActiveRecord de Rails).
Sé que la autorización es muy diferente en PostgreSQL (a diferencia de MySQL y otros que he usado). ¿Cómo debo configurar mi base de datos para que diferentes usuarios puedan acceder a ella? Algunos deberían poder CRUDAR, pero otros solo podrían leer, etc.
Gracias por cualquier ayuda. Lo siento, sé que esta es una pregunta muy básica, pero no he podido encontrar la respuesta yo mismo.
fuente
myapp
lugar de lorails
anterior? Porquemyapp
posee las tablas (nunca especifiqué eso, la migración debe tener). De todos modos, sería sortA sentido si Retitulémyapp
amyapp_group
y luego hice un nuevo usuariomyapp
, que los rieles de aplicación sería utilizar para conectarse a DB. Makemyapp
y el existentemeltemi
, ambos miembros delmyapp_group
rol. Pero, ¿qué sucede cuando ejecuto la próxima migración? ¿No será propiedad demyapp
volver a crear el problema nuevamente?roles
(desde la versión 8.1). Los términosuser
ygroup
se mantienen por razones históricas y de compatibilidad. Básicamente, un "grupo" es un rol sin el privilegio de inicio de sesión. Puede concedermyapp
ameltemi
incluso simyapp
es sólo otro "usuario". Comience leyendo el manual aquí .roles
vsgroups
vsusers
separación en Postgres, al menos creo que sí. Lamento usar la terminología incorrecta (y confusa) anterior. Pero todavía no entiendo cómo configurar mi base de datos, por lo que un rol sin inicio de sesión OWNS la base de datos y dos roles de inicio de sesiónmyapp
ymeltemi
ambos pueden tener acceso completo. Una de esas funcionesmyapp
será ejecutar migraciones de Rails que, inevitablemente, crearán nuevas tablas que, una vez más, pertenecen amyapp
un usuario de inicio de sesión. ¿Debo hacermemeltemi
un 'miembro'myapp
y terminar con esto? Pero eso solo parece torpe ... ¿no?myapp
poseemeltemi
, entonces eso sería lo correcto. Si deseameltemi
obtener solo un subconjunto de privilegios, no lo haría. Luego, cree un rol grupal para mantener el conjunto de privilegios y otórguele esomeltemi
. Probablemente le interesará esta pregunta relacionada con SO . Respondí explicandoDEFAULT PRIVILEGES
SET ROLE
comando al comienzo de sus migraciones y unRESET ROLE
final, pero no confiaría en que Rails ejecute todo correctamente en orden. Erwin tiene razón; en este caso, la mejor solución será queGRANT
los rieles del usuario otorguen la propiedad al otro usuario, utilizando el primer usuario como grupo para el segundo.