PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Gestion d'utilisateurs et de droits.

Technique - général | Gestion d'utilisateurs et de droits.

Par Makkhdyn le 20/08/2007 - 10:39

Bonjour,

J'ai un léger soucis au niveau de la conception d'une base de donnée.
Que je vous explique la situation:
Je suis en train de faire un programme, qui utilises une base de donnée PostgreSQL. Dans cette base est stocké une liste d'utilisateurs avec leurs mots de passes, ID, nickname etc.

Dans cette même application, l'utilisateur peut commenter des articles qui sont stockés eux même dans la base de donnée. Et pour chaque commentaire, je stocke (entre autres) l'ID de l'utilisateur qui a posté ce commentaire (afin qu'il ne place pas trop de commentaires).

Le problème c'est que pour se connecter a la base de donnée, l'utilisateur passe par un compte générique qui a accès a la base de donnée en lecture/écriture/modification.
Ce qui fait que je ne peux pas "obliger" l'utilisateur (lorsqu'il inscrit un nouveau commentaire) a rentrer le bon ID. Puis en plus de ça, étant donné que mon application est sensée être accessible au public (et open source) je me retrouve avec des problèmes plus qu'évidents de sécurité.

J'ai donc pensé a un autre système. ou je ne posséderais plus de table d'utilisateurs, mais ou les utilisateurs seraient directement des utilisateurs de la base de donnée.

Donc ici intervient la première question:
Est-ce bien de faire ça ? De créer un utilisateur de la base de donnée pour chaque membre ?

Maintenant pour limiter ce que peut inscrire un utilisateur dans la BDD, j'ai voulu créer des fonctions (addcomment et autres) auxquels les utilisateurs ont accès en toute liberté, tout en leur privant des droits SELECT INSERT etc.

Seconde question:
Est-ce possible de faire comme ça ? C'est a dire que l'utilisateur appelle une fonction qui fera un INSERT et qu'en même temps l'utilisateur n'ai pas le droit lui même de faire une INSERT "manuellement".

Je vous remercie d'avance,
Makkhdyn

PS: Après relecture, j'ai bien vu que mon post est assez fourni, et pas forcement facile a comprendre, je reste donc a disposition pour les moindres questionnements.

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Hum, j'ai réussi a résoudre

Makkhdyn/ = 20 Août, 2007 - 11:46

Hum, j'ai réussi a résoudre ma seconde question grace à SECURITY DEFINER lors de la création de la fonction.
Maintenant il ne me reste plus que le premier problème qui était pour résumer, "est-ce mieux d'enregistrer les utilisateurs de mon application dans une table "users" spéciale, ou bien dans pg_user?" tout en sachant qu'il est sencé y avoir énormément d'utilisateurs.
(Ça m'arrangerais que ça soit mieux de passer par pg_user.)


Bonjour

Christophe Chauvet/ = 21 Août, 2007 - 11:21

Bonjour

On est toujours tenter lorsque l'on créer un programme de gérer soit même sa gestion des utilisateurs dans une tables séparée. on peut bien sur se basé sur le système de rôles introduit dans la 8.1 donc un article est dispo ici.

pour ma part voici comment je procède
- je crée une table utilisateur qui contient les infos de mes utilisateurs (login/pass/nom/prenom/mail,etc....)
- je crée un rôle CNX avec avec l'attribut LOGIN et celui n'a accès en SELECT qu'a ma table contenant les utilisateurs (il me sert seulement à verifier le login mot de passe et récupérer le rôle de base de cette utilisateur).
- ensuite j'effectue un SET ROLE nom_role_utilisateur
- il faut bien sur définir dans votre cas un rôle pour chaque utilisateurs, et définir aussi les droit de chaque rôle sur les tables.
(vous pouvez pour cela definir des rôles génériques dont vos rôles utilisateurs hériteront.

j'utilise l'utilisateur de connexion CNX car on laisse sur le poste des utilisateurs (dans le cas d'application locale) les login/pass en clair dans les fichiers de config, cela s'apparente a des failles de sécurités, dans notre cas cette utilisateur n'a accès qu'a la table de gestion des utilisateurs en SELECT, il faut bien sur crypter les mot de pass dans cette base (MD5 par ex) pour éviter à une personne malveillante de récupérer un couple login/pass et de se connecter également à l'applicatif.

Cordialement.

Christophe Chauvet
KrysKool.org


Merci pour cette solution.

Makkhdyn/ = 21 Août, 2007 - 20:25

Merci pour cette solution.

Ça m'a permit de découvrir les rôles (jusqu'a présent je passais pas les users et groupes normaux...).
Cependant je ne comprends pas vraiment l'interet de passer par un rĂ´le CNX.
En effet passer par CNX signifie que l'user se loggue envoie son mot de passe au serveur et change de rĂ´le. Et ce a chaque connection.
N'est il pas plus simple de se logguer directement (donc d'avoir tous les "SET ROLE nom_role_utilisateur" avec l'attribut login) ?

Peu importe le cas, que ça soit en stockant les logins/pass d'accès a la BDD ou les logins/pass de connection en tant que tel ou tel utilisateur, le défaut au niveau sécurité est le même.
Qui plus est, ne peut-on pas stocker le pass de connection Ă  la BDD au format md5 ?
Si l'on sécurise les accès, lors de la création d'un role, on spécifie "ENCRYPTED" ou mieux, on active "password_encryption" dans la config du serveur, plus besoin de stocker de mots de passes en clair.

Sinon pour ce qui est de CNX, inutile de lui donner les droits SELECT, il suffit de créer (ce qui était mon second problème que j'ai réussi a résoudre) une fonction qui fait la vérification et de lui donner le mode "SECURITY DEFINER".


© PostgreSQLFr, tous droits rĂ©servĂ©s.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.