Dado un rol de base de datos user1
, una función something()
definida como un procedimiento almacenado y una vista creada como:
CREATE VIEW view1 AS select * from something()
Y, dados estos permisos:
REVOKE ALL ON FUNCTION something FROM user1
REVOKE SELECT ON view1 FROM user1
Cuando corro SELECT * FROM view1
, aparece un error permission denied for function something()
.
Mi pregunta es, si revoco los permisos de selección en la vista, ¿por qué se llama a la función? Esperaba recibir algo como:
permission denied for relation view1
¡Gracias!
postgresql
permissions
view
santios
fuente
fuente
something()
función. Una prueba rápida sería modificar la consulta para que obtenga un plan de explicación diferente, ajustando los permisos en consecuencia, y luego ver si se arroja el error de permiso en lasomething()
función o si sigue cómo se está reevaluando el nuevo plan de ejecución.Respuestas:
El problema en ese caso no es exactamente sobre el orden de permisos, sino el orden de ejecución.
En resumen, para PostgreSQL:
1- Las vistas que son tablas de acceso anularán el permiso de tablas
2- Las funciones de acceso a las vistas deberán evaluar todas las funciones antes de comprobarlas, por lo que las funciones deben ejecutarse antes de acceder a la vista, incluso si la vista no tiene permisos de selección ...
¿Cómo podemos probar eso?
En postgresql, las vistas pueden otorgarle permisos para realizar una selección en una tabla, incluso si el usuario no tiene estos permisos.
Por ejemplo:
Inicie sesión como usuario 1:
En el caso, el usuario podrá seleccionar view2 incluso sin tener permiso para seleccionar la tabla.
Pero, ¿ qué pasa si hacemos lo mismo con una función ? El comportamiento NO es el mismo. Creemos una función que espere 5 segundos antes de devolver 1 (para que podamos depurar si postgresql está ejecutando la función cada vez que llamamos a la vista)
Inicie sesión como usuario 1:
El permiso para seleccionar en la vista no anula el permiso de la función, e incluso peor si revocamos los permisos de view1, el mensaje aún muestra que postgresql detuvo nuestra consulta debido a la función, sin importar el permiso de la vista. (eso es exactamente lo que está sucediendo en la pregunta)
Pero, ¿se está comprobando realmente la función primero? Si otorgamos los permisos 'todos' a la función, pero revocamos el permiso de vista ...
Como puede ver postgresql ESPERÓ 5 SEGUNDOS antes de decir que no tenemos permiso para generar la vista , lo que muestra que la función "algo ()" se ejecuta. Por lo tanto, la función de retorno de datos debe existir antes de la verificación de la vista.
Entonces, ahora con estas pruebas, ahora sabemos que PostgreSQL necesitaba evaluar primero todas las funciones antes de continuar nuestra consulta, es como si la consulta aún no existiera hasta que todas las funciones involucradas se hayan completado por completo, por lo que la vista no se puede resolver para postgresql saber si tenemos o no permiso para seleccionarlo.
Creo que esto responde a su pregunta en términos de "orden de permiso", pero por qué postgresql necesita evaluar todas las funciones antes de continuar, esa es otra pregunta ...
fuente