2012-02-12 9 views
7

Tengo 3 funciones: superusuario, usuario de poder y usuario. Tengo la tabla "datos" y las funciones data_select y data_insert.postgresql 9.1 - tablas de acceso a través de las funciones

Ahora me gustaría definir, que solo el superusuario puede acceder a la tabla "datos". Poweruser y el usuario no pueden acceder a la tabla "datos" directamente, sino solo a través de las funciones.

El usuario puede ejecutar solo la función data_select, poweruser puede ejecutar tanto data_select como data_insert.

Entonces puedo crear usuarios alice, bob, ... y heredar los privilegios de usuario o poweuser.

¿Esto realmente se puede lograr? Estoy peleando con esto por segundo día y sin llegar a ningún lado.

Gracias por su tiempo.

Respuesta

8

Sí, esto es factible.

"superusuario" podría ser un superuser real, postgres de forma predeterminada. Renovo el rol para usuarios simples a usr, porque user es una palabra reservada - no la use como identificador.

CREATE ROLE usr; 
CREATE ROLE poweruser; 
GRANT usr TO poweruser; -- poweruser can do everything usr can. 

CREATE ROLE bob PASSWORD <password>; 
GRANT poweruser TO bob; 

CREATE ROLE alice PASSWORD <password>; 
GRANT usr TO alice; 

REVOKE ALL ON SCHEMA x FROM public; 
GRANT USAGE ON SCHEMA x TO usr; 

REVOKE ALL ON TABLE x FROM public; 
REVOKE ALL ON TABLE y FROM public; 

CREATE FUNCTION 
    ... 
SECURITY DEFINER; 

REVOKE ALL ON FUNCTION ... FROM public; 
GRANT EXECUTE ON FUNCTION a TO usr; 
GRANT EXECUTE ON FUNCTION b TO poweruser; 

O puede crear roles daemon de inicio de sesión sin poseer las funciones y mantener los derechos respectivos sobre la mesa. Eso sería aún más seguro.

Si va por esta ruta, amorALTER DEFAULT PRIVILEGES (presentado con PostgreSQL 9.0). More details in this related answer.

Lea el capítulo Writing SECURITY DEFINER Functions Safely en el manual.

Cuestiones relacionadas