Mientras respondía a esta pregunta , di algunos consejos (infundados) sobre
create policy test_policy on policy for all to public using ( user_id = session_user_id());Por cierto, debe calificar el esquema de la llamada
session_user_id()para que su política sea realmente segura, de modo que el usuario no pueda inyectar su propia funciónsession_user_ida través desearch_path.
Pero, ¿es este realmente el caso? No recordaba bien el tema search_path con las funciones SECURITY DEFINER .
¿Cómo y cuándo se analizan las políticas de seguridad de nivel de fila? ¿Se resuelven las referencias durante la definición o durante la evaluación?
Tendría sentido que los identificadores estuvieran vinculados en tiempo de ejecución y no en tiempo de ejecución, pero no pude encontrar nada en los documentos al respecto.
Las definiciones de políticas se almacenan en pg_policy , donde la cláusula USING se almacena en la columna polqual y la expresión WITH CHECK se almacena en polwithcheck .
Ambas columnas son del tipo de datos pg_node_tree , que es una instrucción SQL analizada. Por lo tanto, las políticas se analizan cuando se crean, no cuando se ejecutan, al igual que las vistas o las funciones SQL conformes a los estándares (nuevo en v14). Eso significa que la configuración de search_path solo es relevante cuando se crea la política, no cuando se ejecuta.