Étant donné un rôle de base de données user1
, une fonction something()
définie comme une procédure stockée et une vue créée comme:
CREATE VIEW view1 AS select * from something()
Et, étant donné ces autorisations:
REVOKE ALL ON FUNCTION something FROM user1
REVOKE SELECT ON view1 FROM user1
Lorsque je cours SELECT * FROM view1
, j'obtiens une erreur permission denied for function something()
.
Ma question est, si je révoque les autorisations de sélection sur la vue, pourquoi la fonction est appelée? Je m'attendais à recevoir quelque chose comme:
permission denied for relation view1
Je vous remercie!
postgresql
permissions
view
santios
la source
la source
something()
fonction. Un test rapide serait de modifier la requête afin d'obtenir un plan d'explication différent, d'ajuster les autorisations en conséquence, puis de voir si l'erreur d'autorisation est levée sur lasomething()
fonction ou si elle suit la façon dont le nouveau plan d'exécution est réévalué.Réponses:
Le problème dans ce cas ne concerne pas exactement l'ordre d'autorisation, mais l'ordre d'exécution.
En résumé, pour PostgreSQL:
1- Les vues qui accèdent aux tables remplaceront l'autorisation des tables
2- Les vues d'accès aux fonctions, devront évaluer toutes les fonctions, avant d'être vérifiées - donc les fonctions doivent être exécutées avant d'accéder à la vue, même si la vue n'a pas les autorisations de sélection ...
Comment pouvons-nous prouver cela?
Dans postgresql, les vues peuvent vous donner des autorisations pour effectuer une sélection dans une table, même si l'utilisateur ne dispose pas de ces autorisations.
Par exemple:
Connectez-vous en tant qu'utilisateur 1:
Dans le cas, l'utilisateur pourra sélectionner view2 même sans avoir l'autorisation de sélectionner la table.
Mais que faire si nous faisons la même chose avec une fonction ? Le comportement n'est PAS le même. Permet de créer une fonction qui attend 5 secondes avant de renvoyer 1 (afin que nous puissions déboguer si postgresql exécute la fonction chaque fois que nous appelons la vue)
Connectez-vous en tant qu'utilisateur 1:
L'autorisation de sélectionner dans la vue ne remplace pas l'autorisation de fonction, et pire encore si nous révoquons les autorisations de view1, le message montre toujours que postgresql a arrêté notre requête à cause de la fonction, quelle que soit l'autorisation de la vue. (c'est exactement ce qui se passe dans la question)
Mais la fonction est-elle vraiment vérifiée en premier? Si nous accordons les autorisations «tous» à la fonction, mais que nous révoquons l'autorisation d'affichage ...
Comme vous le voyez, postgresql a ATTENDU 5 SECONDES avant de dire que nous n'avons pas l'autorisation de sortir la vue , montrant que la fonction "quelque chose ()" est exécutée. Le retour des données de fonction doit donc exister avant la vérification de la vue.
Donc maintenant avec ces tests, nous savons maintenant que PostgreSQL devait d'abord évaluer toutes les fonctions avant de continuer notre requête, c'est comme si la requête n'existait toujours pas jusqu'à ce que toutes les fonctions envisagées soient complètement terminées, donc la vue ne peut pas être résolue pour postgresql savoir si nous avons ou non l'autorisation de le sélectionner.
Je pense que cela répond à votre question en termes de "permission order", mais pourquoi postgresql doit évaluer toutes les fonctions avant de continuer, c'est une autre question ...
la source