Page 1 sur 1

Problèmes de droits dans MySQL

Posté : 08 août 2008, 17:17
par Louisss
Bonjour.

Je suis en train d'essayer d'améliorer un peu l'administration de mes bases MySQL en suivant les conseils du manuel PHP, et il y a un truc que je ne comprend pas bien : que faut-il configurer pour qu'un utilisateur n'ait des droits que sur une seule base ?

Si j'ai bien compris, les droits attribués aux utilisateurs sont catégorisés de la façon suivante :
1) Les droits globaux qui s'appliquent à toutes les bases et les droits administratifs.
2) Les droits spécifiques à une base en particulier.
3) Les droits spécifiques à une table en particulier.

Je me suis donc créé un utilisateur dont le but est uniquement de gérer les requêtes type SELECT, INSERT, UPDATE et DELETE dans une base. Donc, je ne lui donne aucun droit global, mais uniquement ces 4 droits pour la base en question. Résultat : ça ne fonctionne pas. Je ne reçois aucun message d'erreur signalant un problème de connexion, mais il n'exécute aucune requête. D'après le manuel de MySQL, j'en conclu qu'il franchi le premier contrôle d'accès (vérification de la connexion), mais pas le second (vérification de la requête).

J'essaie de lui donner tous les droits sur la base : même résultat.

Je lui donne finalement ces 4 droits au niveau global, et là ça marche. Mais je ne veux justement pas lui donner des droits globaux !

Petite précision : je manipule les droits avec PHPMyAdmin 2.10.2 et MySQL est en version 5.0.41.

Qu'est-ce qui m'a échappé ?

Merci d'avance

Posté : 08 août 2008, 17:20
par steph29
recharger les privileges?

Posté : 08 août 2008, 17:25
par Louisss
Oui, ça je l'ai fait plein de fois, mais ça ne change rien. J'ai même essayé d'arrêter et redémarrer le serveur, mais c'est pas mieux.

Posté : 08 août 2008, 17:37
par Sékiltoyai
Tu as peut-être fait une mauvaise manip. Supprime l'utilisateur et essaye un :

Code : Tout sélectionner

GRANT SELECT, INSERT, UPDATE et DELETE ON 'ta_base' TO 'test'@'localhost' IDENTIFIED BY 'machin';
Normalement ton utilisateur 'test' n'aura le droit que de se connecter en local sur la base 'ta_base', et il ne pourra que faire des requêtes de base. Essaye un SELECT sur cette base.
Je te conseille de faire tous tes tests par un client en ligne de commande, en te connectant en ssh à ton serveur puis en exécutant 'mysql --host=localhost --user=test --password=machin ta_base'.

Reviens nous voir pour nous expliquer ce qu'il s'est passé…

Posté : 09 août 2008, 10:35
par Louisss
Voilà ce que j'ai fait :
- Supprimer et recréer l'utilisateur de test (nommé user_perso) dans dans PHPMyAdmin.
- Exécuter le script suivant :

Code : Tout sélectionner

mysql_connect("localhost","root","root") or die("Impossible de se connecter avec cet utilisateur"); mysql_select_db("Perso") or die("Impossible de se connecter à cette base"); $req = "GRANT SELECT ON 'Perso' TO 'user_perso'@'localhost' IDENTIFIED BY 'motdepasse';"; $res = mysql_query($req);
- Ensuite, je teste l'utilisateur avec le script suivant :

Code : Tout sélectionner

mysql_connect("localhost","user_perso","motdepasse") or die("Impossible de se connecter avec cet utilisateur"); mysql_select_db("Perso") or die("Impossible de se connecter à cette base"); $req = "SELECT * FROM Mois1;"; $res = mysql_query($req); $X = mysql_result($res, 'Jour', 0); echo $X;
Résultat : "Impossible de se connecter à cette base".

Pour info, PHPMyAdmin ne montre pas les nouveaux privilèges que ma première requête aurait due ajouter à user_perso. C'est sûrement là qu'il y a un problème, non ? Mais alors lequel ???

Posté : 09 août 2008, 13:05
par Sékiltoyai
Au temps pour moi, il y avait une petite erreur :

Code : Tout sélectionner

GRANT SELECT ON Perso.* TO 'user_perso'@'localhost' IDENTIFIED BY 'motdepasse';
Et je te conseille de faire tes tests en ligne de commande, ou de bien afficher les erreurs sql dans le script…

Posté : 11 août 2008, 18:02
par Louisss
Effectivement, maintenant ça marche.

Du coup, j'ai essayé de voir ce qui n'allait pas quand j'alloue les droits à mon utilisateur dans PHPMyAdmin : et le problème vient visiblement que PHPMyAdmin génère (et exécute) une requête avec une erreur de syntaxe :

Code : Tout sélectionner

GRANT SELECT ON 'Perso'.* TO 'user_perso'@'localhost' IDENTIFIED BY 'motdepasse';
Si j'exécute cette requête directement dans mon script avec affichage des erreurs SQL, je reçois un message d'erreur de syntaxe due à la présence des apostrophes autour de 'Perso'.*.
Je suis un peu déçu par PHPMyAdmin qui parait bien fonctionner en dehors de ça. Le plus embêtant, en plus, c'est qu'en refaisant des tests après, PHPMyAdmin semble parvenir à exécuter sa requête erronée. Du coup, il fonctionne aléatoirement ou quoi ?

Mieux vaut savoir qu'en ce qui concerne les droits des utilisateurs, PHPMyAdmin n'est visiblement pas au top.

Posté : 11 août 2008, 23:19
par Sékiltoyai
En fait je t'ai induit en erreur (c'est pour cela que je me suis repris), les quotes autour du nom de la base sont une erreur (par contre, c'est juste autour de l'utilisateur ou de l'hôte…).
Après, je te conseillerais d'éviter PMA pour les tâches d'administration, il vaut mieux vraiment savoir ce que tu fais…

Posté : 12 août 2008, 12:06
par Louisss
Ok, merci Sékiltoyai.

Mais maintenant que je peux manier et expérimenter "tranquillement" l'attribution de droits, j'en viens à constater un autre truc un peu perturbant quand on ne le sait pas : visiblement, un utilisateur qui n'a que le droit de faire des requêtes UPDATE en est en fait incapable. Il faut lui accorder aussi le droit de faire des SELECT. En tout cas, c'est la conclusion à laquelle j'arrive après de nombreux test.

Est-ce exact ?
Est-ce la même chose pour les utilisateurs à qui on ne veut permettre que des INSERT ou que des DELETE ?

Posté : 12 août 2008, 12:29
par Sékiltoyai
En fait, dès que tu mets une clause WHERE dans une requête, ou toute autre clause nécessitant la lecture de données, il te faut le droit SELECT. Une telle requête fonctionera :

Code : Tout sélectionner

UPDATE machin SET test=3;
Pour DELETE c'est pareil, cette requête fonctionnera :

Code : Tout sélectionner

DELETE FROM machin;
Celle ci non :

Code : Tout sélectionner

DELETE FROM machin WHERE id=1;
Pour les insertions, il n'y a pas de problème, il n'y a aucune lecture à faire.