Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
J'ai installé pg sur un serveur spatialisé par postgis. Tout fonctionne très bien, le serveur rend plusieurs milliers d'objets vectoriels à distance de manière très fluide, c'est génial.
Maintenant je souhaite ouvrir le service au public, c'est là que je bloque, mes connaissances en administration de droits étant nulles.
Ce que je voudrais : créer un utilisateur "anonyme" ayant :
- les droits select et connect sur la base qui s'appelle "ressources_publiques"
- limiter le nombre de connexions simultanées à 10 pour ce role
- mettre fin à la connexion après deux heures d'innactivité pour ce user (est-ce possible ?)
Mais je n'y arrive pas ...
avec pgadmin j'ai crée un role de connexion "anonyme" ça c bon, je peux me connecter à la base, mais je ne vois rien...
j'ai essayé
GRANT SELECT ON DATABASE ressources_publiques TO anonyme
GRANT SELECT ON DATABASE ressources_publiques TO GROUP anonyme
dans psql en tant que user postgres mais ça ne fonctionne pas.
A titre d'information, j'ai deux bases sur le serveur :
la base postgres (celle là à priori le user anonyme n'a pas à y toucher)
la base ressources_publiques
cette dernière contient deux shémas :
- irennes (qui contient les tables georeferencées)
- public (qui contient les fonctions de spatialisation comme le calcul de surface sur les objets etc...)
Je pense que mon pg_hba.conf est bon, j'ai tout ouvert pour tous les users depuis l'ip du poste à partir duquel je me connecte. j'a pas d'erreurs de ce coté là.
Merci de l'aide que vous pouvez m'apporter.
peyo
(pg 8.3.12 sous debian lenny)
Dernière modification par peyo (12/01/2011 13:41:26)
Hors ligne
Le privilège SELECT est un privilège de table, pas de base. Sur une base, c'est grant connect qu'on peut donner (ou révoquer en fait, puisque tout le monde a ce grant par défaut). Pour le privilège SELECT, vous devrez le faire table par table.
Pour limiter le nombre de connexions par un utilisateur, c'est dans ALTER USER que vous trouverez la solution.
Il y a aussi des GRANT à faire sur les schemas, et mettre ces schemas dans le search_path.
Désolé, c'est un peu expéditif, mais je n'ai pas pour le moment le temps de vous en dire plus
Marc.
Hors ligne
ok merci, vu, faut le faire à la mano...
voici donc un script bash qui donne des droits de SELECT à un user pour de multiples tables d'un schéma dans mabase
#!/bin/bash
# update des droits du user anonyme sur le schema mon_shema de mabase
for table in `echo "SELECT relname FROM pg_stat_all_tables WHERE schemaname='mon_shema';" | psql mabase | grep -v "pg_" | grep "^ "`;
do
echo "GRANT SELECT ON TABLE mon_shema.$table TO anonyme;"
echo "GRANT SELECT ON TABLE mon_shema.$table TO anonyme;" | psql mabase
done
# REVOKE
#for table in `echo "SELECT relname FROM pg_stat_all_tables WHERE schemaname='mon_shema';" | psql mabases | grep -v "pg_" | grep "^ "`;
#do
# echo "REVOKE ALL PRIVILEGES ON mon_shema.$table FROM anonyme CASCADE;"
# echo "REVOKE ALL PRIVILEGES ON mon_shema.$table FROM anonyme CASCADE;" | psql mabase
#done
Dernière modification par peyo (12/01/2011 17:25:35)
Hors ligne
Merci pour le partage de ce script.
Je m'étonne de l'utilisation de la vue système pg_stat_all_tables pour ça. Surtout qu'elle contient aussi des objets systèmes. Il est certainement mieux d'utiliser cette requête :
select n.nspname||'.'||c.relname
from pg_class c, pg_namespace n
where c.relnamespace=n.oid
and n.nspname = 'le_schema'
and c.relkind='r';
ou pour tous les schémas utilisateurs :
select n.nspname||'.'||c.relname
from pg_class c, pg_namespace n
where c.relnamespace=n.oid
and n.nspname <> 'pg_catalog'
and n.nspname <> 'information_schema'
and n.nspname !~ '^pg_toast'
and c.relkind='r';
Et je vois votre grep qui a certainement pour but de ne conserver que les lignes de résultats. Utilisez plutôt les options -At. Par exemple :
export REQUETE="select n.nspname||'.'||c.relname from pg_class c, pg_namespace n where c.relnamespace=n.oid and n.nspname <> 'pg_catalog' and n.nspname <> 'information_schema' and not n.nspname ~ '^pg_toast' and c.relkind='r'"
psql -At -c "$REQUETE" yang
public.counters
public.services
Guillaume.
Hors ligne
Pour infos, j'ai modifié trois fois le message ci-dessus, donc ne pas hésiter à relire si vous avez été plus rapide que moi.
Guillaume.
Hors ligne
Merci je regarde ça attentivement. Pourquoi est-ce ennuyeux de passer par une vue ? le filtre sur le schema rend les bonnes tables. Sympa le coup du -At ça va m'éviter un paquet de filtres.
J'ai encore du mal avec le langage , quand vous écrivez
from pg_class c
c devient un alias de pg_class ?
Hors ligne
Pourquoi est-ce ennuyeux de passer par une vue ?
Le problème n'est pas de passé par une vue. Le problème est de faire appel à une table de statistiques qui est vide ou pas à jour si le collecteur de statistiques est désactivé. Autant accéder directement à l'information réelle, qui se trouve dans la table pg_class.
quand vous écrivez "from pg_class c", c devient un alias de pg_class ?
Oui, c'est cela.
Guillaume.
Hors ligne
Bonjour, voici une version moins sale pour mettre à jour des droits de visualisation :
#!/bin/bash
# Le script doit être exécuté en tant que user postgres
# Donne des droits en lecture seule à un utilisateur sur
# les schemas publics d'une base de donnée postgres. Les
# droits sont limités à la visualisation des tables
# publiques de la base ( lecture seule : SELECT ).
USERNAME="mon_user"
DATABASENAME="ma_db"
MAXCONNECTIONS="15"
PSQL="/usr/lib/postgresql/8.3/bin/psql"
# Mise à jour des droits sur les schemas
REQUETE="select n.nspname
from pg_namespace n
where n.nspname <> 'pg_catalog'
and n.nspname <> 'information_schema'
and n.nspname !~ '^pg_toast'
and n.nspname <> 'pg_temp_1';"
for schema in `$PSQL -At -d $DATABASENAME -c "$REQUETE"`
do
$PSQL -a -d $DATABASENAME -c "GRANT USAGE ON SCHEMA $schema TO $USERNAME"
done
# Mise à jour des droits sur les tables
REQUETE="select n.nspname||'.'||c.relname
from pg_class c, pg_namespace n
where c.relnamespace=n.oid
and n.nspname <> 'pg_catalog'
and n.nspname <> 'information_schema'
and n.nspname !~ '^pg_toast'
and c.relkind='r';"
for table in `$PSQL -At -d $DATABASENAME -c "$REQUETE"`
do
$PSQL -a -d $DATABASENAME -c "GRANT SELECT ON TABLE $table TO $USERNAME;"
done
# Nombre de connections autorisées
$PSQL -a -d $DATABASENAME -c "ALTER USER $USERNAME CONNECTION LIMIT $MAXCONNECTIONS;"
Hors ligne
Pages : 1