545 votes

ERREUR MySQL 1045 (28000) : Accès refusé pour l'utilisateur 'bill'@'localhost' (avec 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 suis en train de faire.

Je suis connecté à mon instance Amazon EC2. Je peux me connecter avec MySQL Root avec cette commande :

mysql -u root -p

J'ai ensuite créé un nouveau projet de loi sur les utilisateurs avec l'hôte %.

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

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

J'ai entré le mot de passe correct et j'ai obtenu cette erreur :

ERREUR 1045 (28000) : Accès refusé pour l'utilisateur 'bill'@'localhost' (avec mot de passe : YES)

0 votes

Je pense que cela vous connectera en tant que 'bill'@'localhost' ce qui n'est probablement pas ce que vous voulez.

42 votes

Avez-vous FLUSH PRIVILEGES ?

10 votes

Ok, j'ai essayé sans succès. Une autre suggestion s'il vous plaît.

498voto

RandomSeed Points 14960

Vous avez probablement un utilisateur anonyme ''@'localhost' ou ''@'127.0.0.1' .

Conformément à le manuel :

Lorsque plusieurs correspondances sont possibles, le serveur doit déterminer laquelle des d'entre elles à utiliser. Il résout ce problème de la manière suivante : (...)

  • Lorsqu'un client tente de se connecter, le serveur examine les rangées suivantes [de la table mysql.user] dans un ordre trié.
  • Le serveur utilise la première ligne qui correspond au nom d'hôte et au nom d'utilisateur du client.

(...) Le serveur utilise des règles de tri qui ordonnent les rangées avec les valeurs de l'hôte les plus spécifiques en premier . Noms d'hôtes littéraux [comme 'localhost'] et les adresses IP sont les plus spécifiques.

Par conséquent, un tel utilisateur anonyme " masquerait " tout autre utilisateur comme '[any_username]'@'%' lors de la connexion depuis localhost .

'bill'@'localhost' correspond 'bill'@'%' mais correspondrait à (par exemple) ''@'localhost' avant les mains.

La solution recommandée est de supprimer cet utilisateur anonyme (c'est généralement une bonne chose à faire de toute façon).


Les modifications ci-dessous sont pour la plupart sans rapport avec la question principale. Elles visent uniquement à répondre à certaines questions soulevées dans d'autres commentaires de ce fil de discussion.

Edit 1

Authentification en tant que 'bill'@'%' à travers une prise.

    root@myhost:/home/mysql-5.5.16-linux2.6-x86\_64# ./mysql -ubill -ppass --socket=/tmp/mysql-5.5.sock
    Welcome to the MySQL monitor (...)

    mysql> SELECT user, host FROM mysql.user;
    +------+-----------+
    | user | host      |
    +------+-----------+
    | bill | %         |
    | root | 127.0.0.1 |
    | root | ::1       |
    | root | localhost |
    +------+-----------+
    4 rows in set (0.00 sec)

    mysql> SELECT USER(), CURRENT\_USER();
    +----------------+----------------+
    | USER()         | CURRENT\_USER() |
    +----------------+----------------+
    | bill@localhost | bill@%         |
    +----------------+----------------+
    1 row in set (0.02 sec)

    mysql> SHOW VARIABLES LIKE 'skip\_networking';
    +-----------------+-------+
    | Variable\_name   | Value |
    +-----------------+-------+
    | skip\_networking | ON    |
    +-----------------+-------+
    1 row in set (0.00 sec)

Edit 2

Exactement la même configuration, sauf que j'ai réactivé le réseau et que je crée maintenant un utilisateur anonyme. ''@'localhost' .

    root@myhost:/home/mysql-5.5.16-linux2.6-x86\_64# ./mysql
    Welcome to the MySQL monitor (...)

    mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass';
    Query OK, 0 rows affected (0.00 sec)

    mysql> Bye

    root@myhost:/home/mysql-5.5.16-linux2.6-x86\_64# ./mysql -ubill -ppass \\
        --socket=/tmp/mysql-5.5.sock
    ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
    root@myhost:/home/mysql-5.5.16-linux2.6-x86\_64# ./mysql -ubill -ppass \\
        -h127.0.0.1 --protocol=TCP
    ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
    root@myhost:/home/mysql-5.5.16-linux2.6-x86\_64# ./mysql -ubill -ppass \\
        -hlocalhost --protocol=TCP
    ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

Edit 3

Même situation que dans l'édition 2, en fournissant maintenant le mot de passe de l'utilisateur anonyme.

    root@myhost:/home/mysql-5.5.16-linux2.6-x86\_64# ./mysql -ubill -panotherpass -hlocalhost
    Welcome to the MySQL monitor (...)

    mysql> SELECT USER(), CURRENT\_USER();
    +----------------+----------------+
    | USER()         | CURRENT\_USER() |
    +----------------+----------------+
    | bill@localhost | @localhost     |
    +----------------+----------------+
    1 row in set (0.01 sec)

Conclusion 1, de l'édition 1 : On peut s'authentifier en tant que 'bill'@'%' à travers une prise.

Conclusion 2, à partir de l'édition 2 : Le fait de se connecter par TCP ou par une socket n'a aucun impact sur le processus d'authentification (sauf que l'on ne peut pas se connecter en tant que n'importe qui d'autre que 'something'@'localhost' par le biais d'une prise, évidemment).

Conclusion 3, de l'édition 3 : Bien que j'ai spécifié -ubill J'ai obtenu un accès en tant qu'utilisateur anonyme. Ceci est dû aux "règles de tri" conseillées ci-dessus. Remarquez que dans la plupart des installations par défaut, un utilisateur anonyme, sans mot de passe, existe (et doivent être sécurisés/enlevés).

12 votes

Si vous êtes curieux de savoir pourquoi 'bill'@'localhost' correspond à ''@'localhost' comme je l'ai fait, sachez qu'une chaîne vide fait office de joker dans l'algorithme d'authentification de MySQL.

0 votes

Une courte requête RENAME USER ''@'localhost' TO ''@'%'; J'ai fait ma journée ! Merci !

2 votes

@Sanja Soyez très prudent avec cette solution de contournement. Vous pourriez autoriser un accès anonyme à votre base de données depuis n'importe quel endroit. En cas de doute, je préférerais supprimer l'utilisateur.

166voto

Edgar Aviles Points 399

Essayez :

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;

18 votes

Ceci est plutôt dangereux, si quelqu'un pirate votre compte mysql bill@localhost, il aura un accès infini à toutes les bases de données de votre serveur mysql.

3 votes

Whehey. J'ai dû mettre des guillemets à mon utilisateur 'myusername'@'myhost.static.myip.com' et ça a marché.

0 votes

Cela fonctionne pour moi mais j'ai peur d'avoir donné trop de privilèges à l'utilisateur.

109voto

RolandoMySQLDBA Points 19439

Quand tu as couru

mysql -u bill -p

et j'ai obtenu 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();

UTILISATEUR() rapporte comment vous avez tenté de vous authentifier dans MySQL

CURRENT_USER() rapporte comment vous avez été autorisé à vous authentifier dans MySQL depuis le mysql.user tableau

Cela vous permettra de mieux comprendre 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. .

N'oubliez pas d'appeler explicitement TCP comme protocole pour le client mysql si nécessaire.

1 votes

'bill'@'localhost' devrait correspondre 'bill@%' ne devrait-elle pas ?

0 votes

@Yak l'ordre de tri n'est pas basé uniquement sur la colonne user de mysql.user. MySQL ne fait pas de correspondance de caractères à proprement parler. J'ai écrit sur le protocole d'ordre d'authentification de l'utilisateur dans le DBA StackExchange : dba.stackexchange.com/a/10897/877

0 votes

@YaK C'est pourquoi j'ai spécifiquement mentionné SELECT USER(),CURRENT_USER(); . Vous ne verrez presque jamais d'utilisateurs anonymes apparaître à partir de ces deux fonctions, sauf dans des configurations vraiment médiocres.

23voto

nos Points 102226

Lorsque vous tapez mysql -u root -p vous vous connectez au serveur mysql via un socket unix local.

Cependant, la subvention que vous avez accordée, 'bill'@'%' ne correspond qu'aux connexions TCP/IP, curieusement.

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. mysql -u root -p -h 192.168.1.123 ou n'importe quelle adresse IP locale de votre boîte.

0 votes

"'bill'@'%' ne correspond qu'aux connexions TCP/IP" C'est faux. Essayez-le sur une instance propre (vierge, prête à l'emploi) avec skip-networking

0 votes

@YaK Je n'arrive pas à faire fonctionner 'user'@'%' dans une telle configuration, que voulez-vous dire par ce qui est censé se passer ?

0 votes

J'ai pu me connecter en tant que 'bill'@'%' sur une v5.0 sans réseau (donc via une socket). Quelle version utilisez-vous ? Je vais essayer sur une v5.5.

13voto

fevangelou Points 151

La solution est de supprimer l'utilisateur anonyme (Any) !

J'ai également rencontré le même problème sur un serveur installé par quelqu'un d'autre. Je ne choisis normalement pas de créer un utilisateur anonyme lors de l'installation de MySQL, et je n'avais donc pas remarqué ce problème. Je me suis d'abord connecté en tant qu'utilisateur "Root" et j'ai créé quelques utilisateurs "normaux" (c'est-à-dire des utilisateurs ayant des privilèges uniquement sur les bases de données avec leur nom d'utilisateur comme préfixe), puis je me suis déconnecté, et j'ai ensuite vérifié le premier utilisateur normal. Je n'ai pas pu me connecter. Ni via phpMyAdmin, ni via le shell. Il s'avère que le coupable est cet utilisateur "Any".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X