Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL ERROR 1045 (28000):Odmowa dostępu dla użytkownika 'bill'@'localhost' (przy użyciu hasła:TAK)

Prawdopodobnie masz anonimowego użytkownika ''@'localhost' lub ''@'127.0.0.1' .

Zgodnie z instrukcją :

Gdy możliwe jest wiele dopasowań, serwer musi określić, którego z nich użyć. Rozwiązuje ten problem w następujący sposób:(...)

  • Kiedy klient próbuje się połączyć, serwer przegląda wiersze [tabeli mysql.user] w posortowanej kolejności.
  • Serwer używa pierwszego wiersza, który odpowiada nazwie hosta klienta i nazwie użytkownika.

(...)Serwer używa reguł sortowania, które porządkują wiersze z najbardziej szczegółowymi wartościami hosta na początku .Dosłowne nazwy hostów [takie jak „localhost”] a adresy IP są najbardziej szczegółowe.

Dlatego taki anonimowy użytkownik „zamaskowałby” każdego innego użytkownika, takiego jak '[any_username]'@'%' podczas łączenia z localhost .

'bill'@'localhost' pasuje do 'bill'@'%' , ale pasowałby (np.) ''@'localhost' wcześniej.

Zalecanym rozwiązaniem jest usunięcie tego anonimowego użytkownika (i tak zwykle jest to dobre rozwiązanie).

Poniższe zmiany są w większości nieistotne dla głównego pytania. Mają one na celu tylko udzielenie odpowiedzi na niektóre pytania zadane w innych komentarzach w tym wątku.

Edytuj 1

Uwierzytelnianie jako 'bill'@'%' przez gniazdo.

    [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)

Edytuj 2

Dokładnie taka sama konfiguracja, z wyjątkiem tego, że ponownie aktywowałem sieć i teraz tworzę anonimowego użytkownika ''@'localhost' .

    [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)

Edytuj 3

Taka sama sytuacja jak w edycji 2, teraz z podaniem hasła anonimowego użytkownika.

    [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)

Wniosek 1, z edycji 1:Można uwierzytelnić się jako 'bill'@'%' przez gniazdo.

Wniosek 2, z edycji 2:To, czy ktoś łączy się przez TCP, czy przez gniazdo, nie ma wpływu na proces uwierzytelniania (poza tym, że nie można połączyć się jako ktokolwiek inny niż 'something'@'localhost' oczywiście przez gniazdo).

Wniosek 3, z edycji 3:Chociaż podałem -ubill , przyznano mi dostęp jako anonimowy użytkownik. Wynika to z zalecanych powyżej „reguł sortowania”. Zauważ, że w większości domyślnych instalacji bez hasła, anonimowe użytkownik istnieje (i powinny być zabezpieczone/usunięte).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak ustawić domyślną wartość dla kolumny MySQL Datetime?

  2. Przywróć tradycyjną replikację z GTID

  3. Kod błędu:1215. Nie można dodać ograniczenia klucza obcego (klucze obce)

  4. Levenshtein:MySQL + PHP

  5. Pobieranie ostatniego rekordu w każdej grupie - MySQL