Tout d'abord, permettez-moi de mentionner que j'ai parcouru de nombreuses questions suggérées et que je n'ai trouvé aucune réponse pertinente. Voici ce que je fais.
Je suis connecté à mon instance Amazon EC2. Je peux me connecter à la racine de MySQL avec cette commande :
mysql -u root -p
Puis j'ai créé un nouvel utilisateur bill avec host %.
CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
J'ai accordé tous les privilèges à l'utilisateur bill :
grant all privileges on *.* to 'bill'@'%' with grant option;
Ensuite, je quitte l'utilisateur root et j'essaie de me connecter avec bill :
mysql -u bill -p
en entrant le mot de passe correct et j'obtiens cette erreur :
ERROR 1045 (28000) : Accès refusé pour l'utilisateur 'bill'@'localhost' ; (utilisant le mot de passe : YES)
Quand tu as couru
mysql -u bill -p
et que vous avez eu cette erreur
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
mysqld s'attend à ce que vous vous connectiez en tant que bill@localhost
.
Essayez de créer bill@localhost
.
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
Si vous voulez vous connecter à distance, vous devez spécifier soit le nom DNS, soit l'IP publique, soit 127.0.0.1 en utilisant TCP/IP :
mysql -u bill -p [email protected]
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP
Une fois que vous vous êtes connecté, veuillez exécuter ceci
SELECT USER(),CURRENT_USER();
[USER()][1] indique comment vous avez tenté de vous authentifier dans MySQL.
[CURRENT_USER()][2] indique comment vous avez été autorisé à vous authentifier dans MySQL à partir de la table mysql.user.
Cela vous donnera une meilleure vue de comment et pourquoi vous avez été autorisé à vous connecter à mysql. Pourquoi est-il important de connaître cette vue ? Elle a trait au protocole d'ordre d'authentification de l'utilisateur.
Voici un exemple : Je vais créer un utilisateur anonyme sur mon bureau MySQL.
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| lwdba | % |
| mywife | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)
mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| lwdba | % |
| mywife | % |
| x | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)
mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| | % |
| lwdba | % |
| mywife | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)
mysql>
OK regardez-moi me connecter en tant qu'utilisateur anonyme :
C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select user(),current_user();
+---------------+----------------+
| user() | current_user() |
+---------------+----------------+
| rol@localhost | @% |
+---------------+----------------+
1 row in set (0.00 sec)
mysql>
L'ordre d'authentification est très strict. Il vérifie du plus spécifique au moins spécifique. [J'ai écrit sur ce style d'authentification dans le DBA StackExchange**][3].
N’oubliez pas d’appeler explicitement TCP comme protocole pour le client mysql lorsque cela est nécessaire.
[1] : http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_user [2] : http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_current-user [3] : https://dba.stackexchange.com/a/10897/877
Lorsque vous tapez mysql -u root -p
, vous vous connectez au serveur mysql via un socket unix local.
Cependant, l'autorisation que vous avez donnée, 'bill'@'%'
ne correspond curieusement qu'aux connexions TCP/IP.
Si vous voulez accorder l'accès au socket unix local, vous devez accorder des privilèges à 'bill'@'localhost' ; , ce qui, curieusement, n'est pas la même chose que 'bill'@'127.0.0.1' ;
Vous pouvez également vous connecter en utilisant TCP/IP avec le client de ligne de commande mysql, afin de respecter les privilèges que vous avez déjà accordés, par exemple en exécutant mysql -u root -p -h 192.168.1.123
ou n'importe quelle adresse IP locale de votre ordinateur.