Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL ERROR 1045 (28000):Zugriff verweigert für Benutzer 'bill'@'localhost' (mit Passwort:YES)

Wahrscheinlich haben Sie einen anonymen Benutzer ''@'localhost' oder ''@'127.0.0.1' .

Gemäß dem Handbuch :

Wenn mehrere Übereinstimmungen möglich sind, muss der Server bestimmen, welche davon zu verwenden ist. Es löst dieses Problem wie folgt:(...)

  • Wenn ein Client versucht, eine Verbindung herzustellen, durchsucht der Server die Zeilen [der Tabelle mysql.user] in sortierter Reihenfolge.
  • Der Server verwendet die erste Zeile, die mit dem Client-Hostnamen und dem Benutzernamen übereinstimmt.

(...) Der Server verwendet Sortierregeln, die Zeilen mit den spezifischsten Host-Werten zuerst anordnen .Wörtliche Hostnamen [z. B. 'localhost'] und IP-Adressen sind die spezifischsten.

Daher würde ein solcher anonymer Benutzer jeden anderen Benutzer wie '[any_username]'@'%' "maskieren". beim Verbinden von localhost .

'bill'@'localhost' stimmt mit 'bill'@'%' überein , würde aber mit (z. B.) ''@'localhost' übereinstimmen vorher.

Die empfohlene Lösung besteht darin, diesen anonymen Benutzer zu löschen (dies ist normalerweise sowieso eine gute Sache).

Die folgenden Änderungen sind für die Hauptfrage größtenteils irrelevant. Diese sollen nur einige Fragen beantworten, die in anderen Kommentaren in diesem Thread aufgeworfen wurden.

Bearbeiten 1

Authentifizierung als 'bill'@'%' über eine Steckdose.

    [email protected]:/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() |
    +----------------+----------------+
    | [email protected] | [email protected]%         |
    +----------------+----------------+
    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)

Bearbeiten 2

Genau das gleiche Setup, außer dass ich das Netzwerk wieder aktiviert habe und jetzt einen anonymen Benutzer ''@'localhost' erstelle .

    [email protected]:/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

    [email protected]:/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)
    [email protected]:/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)
    [email protected]:/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)

Bearbeiten 3

Gleiche Situation wie in Bearbeiten 2, jetzt wird das Passwort des anonymen Benutzers bereitgestellt.

    [email protected]:/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() |
    +----------------+----------------+
    | [email protected] | @localhost     |
    +----------------+----------------+
    1 row in set (0.01 sec)

Fazit 1, aus Edit 1:Man kann sich als 'bill'@'%' authentifizieren über eine Steckdose.

Schlussfolgerung 2, aus Bearbeitung 2:Ob man sich über TCP oder über einen Socket verbindet, hat keinen Einfluss auf den Authentifizierungsprozess (außer man kann sich nicht als jemand anderes verbinden, außer 'something'@'localhost' natürlich über eine Steckdose).

Schlussfolgerung 3, aus Bearbeitung 3:Obwohl ich -ubill angegeben habe , wurde mir als anonymer Benutzer Zugriff gewährt. Dies liegt an den oben empfohlenen "Sortierregeln". Beachten Sie, dass in den meisten Standardinstallationen kein Passwort, anonym Benutzer existiert (und sollte gesichert/entfernt werden).