ERREUR MySQL 1045 (28000) : Accès refusé pour l'utilisateur 'bill'@'localhost&#39 ; (utilisant le mot de passe : YES)

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&#39 ; (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 -hmydb@mydomain.com
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&#8217oubliez pas d&#8217appeler 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

Commentaires (7)

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&#39 ; , ce qui, curieusement, n'est pas la même chose que 'bill'@'127.0.0.1&#39 ;

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.

Commentaires (4)

Ok, je ne suis pas sûr mais c'est probablement le fichier my.cnf dans le répertoire d'installation de mysql qui est en cause. Commentez cette ligne et le problème pourrait être résolu.

bind-address = 127.0.0.1
Commentaires (2)