GRANT
s sur différents objets sont séparés. GRANT
sur une base de données n'a pas de GRANT
droits sur le schéma à l'intérieur. De la même manière, l'ingénierie GRANT
sur un schéma n'accorde pas de droits sur les tables à l'intérieur.
Si vous avez des droits sur SELECT
une table, mais pas le droit de la voir dans le schéma qui la contient, vous ne pouvez pas accéder à la table.
Les tests de droits sont effectués dans l'ordre:
Do you have `USAGE` on the schema?
No: Reject access.
Yes: Do you also have the appropriate rights on the table?
No: Reject access.
Yes: Check column privileges.
Votre confusion peut provenir du fait que le public
schéma a par défaut GRANT
tous les droits sur le rôle public
, dont chaque utilisateur / groupe est membre. Donc, tout le monde a déjà une utilisation sur ce schéma.
La phrase:
(en supposant que les propres conditions de privilège des objets sont également satisfaites)
C'est dire que vous devez avoir USAGE
sur un schéma pour utiliser des objets à l'intérieur, mais avoirUSAGE
sur un schéma n'est pas en soi suffisant pour utiliser les objets dans le schéma, vous devez également avoir des droits sur les objets eux-mêmes.
C'est comme une arborescence de répertoires. Si vous créez un répertoire somedir
contenant un fichier, somefile
définissez-le pour que seul votre propre utilisateur puisse accéder au répertoire ou au fichier (mode rwx------
sur le répertoire , mode rw-------
sur le fichier), personne d'autre ne peut répertorier le répertoire pour voir que le fichier existe.
Si vous accordiez des droits de lecture universelle sur le fichier (mode rw-r--r--
) sans modifier les autorisations de répertoire, cela ne ferait aucune différence. Personne ne pouvait voir le fichier pour le lire, car ils n'ont pas le droit de lister le répertoire.
Si vous définissez rwx-r-xr-x
à la place le répertoire, en le définissant pour que les utilisateurs puissent le répertorier et le parcourir sans modifier les autorisations du fichier, les utilisateurs pourraient répertorier le fichier mais ne pourraient pas le lire car ils n'auraient pas accès au fichier.
Vous devez définir les deux autorisations pour que les utilisateurs puissent réellement afficher le fichier.
Même chose en Pg. Vous avez besoin à la fois des USAGE
droits de schéma et des droits d'objet pour effectuer une action sur un objet, comme à SELECT
partir d'une table.
(L'analogie tombe un peu en ce sens que PostgreSQL n'a pas encore de sécurité au niveau des lignes, donc l'utilisateur peut toujours "voir" que la table existe dans le schéma SELECT
en provenant pg_class
directement. Ils ne peuvent en aucun cas interagir avec elle. , cependant, c'est juste la partie "liste" qui n'est pas tout à fait la même.)
CREATE EXTENSION
. C'est plus ou moins le même problème avec les fichiers créés sous Linux pendant que vous êtessu
. Ce sera bien s'il y a une sorte d'sudo -e
instructions for dans pqsl.GRANT
déclarations non spécifiques aux tables ne sont pas ce que je veux, puisqu'elles affectent toutes les bases de données ...: sGRANT
sur un schéma affecte ce schéma.GRANT ... ON ALL TABLES IN SCHEMA ...
affecte toutes les tables d'un schéma dans une base de données particulière. Il n'y a aucunGRANT
s qui affecte toutes les bases de données (ok, sauf l'GRANT
appartenance à un rôle à un utilisateur).psql
sans-d db
que vous n'opériez "en dehors" d'aucune base de données, mais que vous êtes toujours connecté à une base de données et par défaut vous êtes connecté à la base de données avec le même nom de votre rôle. db = role = user = group ... c'est un peu déroutant: DWITH LOGIN
; essentiellement, tout peut être un groupe et les groupes peuvent être définis pour pouvoir se connecter.Pour un système de production, vous pouvez utiliser cette configuration:
la source
admin
également être accordéCREATE
sur le schéma?GRANT USAGE ON SCHEMA
, l'utilisateur administrateur ne peut pas créer de table mais il peut le faire avecALL GRANT ALL ON SCHEMA
....grant all on schema public to admin
? PS: j'ai ajouté aussigrant usage, select on all sequences in schema public to read_only/read_write;
grant execute on all functions in schema public to read_only/read_write;
Eh bien, voici ma solution finale pour une simple base de données, pour Linux:
la source