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: (...)
- Gdy klient próbuje się połączyć, serwer przegląda wiersze [tabeli mysql.user] w posortowanej kolejności.
- Serwer używa pierwszego wiersza pasującego do nazwy hosta klienta i nazwy użytkownika.
(...) Serwer stosuje reguły sortowania, które najpierw porządkują wiersze z najbardziej konkretnymi wartościami hosta . Dosłowne nazwy hostów [takie jak „localhost”] i adresy IP są najbardziej szczegółowe.
Dlatego taki anonimowy użytkownik „maskowałby” każdego innego użytkownika, takiego jak '[any_username]'@'%'
podczas łączenia się localhost
.
'bill'@'localhost'
pasuje 'bill'@'%'
, ale pasuje (np.)''@'localhost'
przed rękami.
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 jedynie odpowiedzieć na niektóre pytania zadane w innych komentarzach w tym wątku.
Edytuj 1
Uwierzytelnianie za 'bill'@'%'
pośrednictwem gniazda.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
Witamy na monitorze MySQL (...)
mysql> WYBIERZ użytkownika, hosta z mysql.user;
+ ------ + ----------- +
| użytkownik | host |
+ ------ + ----------- +
| rachunek | % |
| root | 127.0.0.1 |
| root | :: 1 |
| root | localhost |
+ ------ + ----------- +
4 rzędy w zestawie (0,00 s)
mysql> SELECT USER (), CURRENT_USER ();
+ ---------------- + ---------------- +
| USER () | CURRENT_USER () |
+ ---------------- + ---------------- +
| bill @ localhost | rachunek @% |
+ ---------------- + ---------------- +
1 rząd w zestawie (0,02 s)
mysql> POKAŻ ZMIENNE PODOBNE do 'skip_networking';
+ ----------------- + ------- +
| Zmienna nazwa | Wartość |
+ ----------------- + ------- +
| skip_networking | ON |
+ ----------------- + ------- +
1 rząd w zestawie (0,00 s)
Edytuj 2
Dokładnie taka sama konfiguracja, z wyjątkiem ponownej aktywacji sieci i teraz tworzę anonimowego użytkownika ''@'localhost'
.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
Witamy na monitorze MySQL (...)
mysql> CREATE USER '' @ 'localhost' IDENTIFIED BY 'anotherpass';
Zapytanie OK, dotyczy 0 wierszy (0,00 s)
mysql> Pa
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket = / tmp / mysql-5.5.sock
BŁĄD 1045 (28000): Odmowa dostępu dla użytkownika „rachunek” @ „localhost” (przy użyciu hasła: TAK)
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol = TCP
BŁĄD 1045 (28000): Odmowa dostępu dla użytkownika „rachunek” @ „localhost” (przy użyciu hasła: TAK)
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol = TCP
BŁĄD 1045 (28000): Odmowa dostępu dla użytkownika „rachunek” @ „localhost” (przy użyciu hasła: TAK)
Edytuj 3
Taka sama sytuacja jak w edycji 2, teraz podając hasło anonimowego użytkownika.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
Witamy na monitorze MySQL (...)
mysql> SELECT USER (), CURRENT_USER ();
+ ---------------- + ---------------- +
| USER () | CURRENT_USER () |
+ ---------------- + ---------------- +
| bill @ localhost | @localhost |
+ ---------------- + ---------------- +
1 rząd w zestawie (0,01 s)
Wniosek 1, z edycji 1: Można uwierzytelnić się 'bill'@'%'
przez gniazdo.
Wniosek 2, z edycji 2: To, czy łączy się przez TCP, czy przez gniazdo, nie ma wpływu na proces uwierzytelniania (z wyjątkiem tego, że nie można się połączyć jak nikt inny, ale 'something'@'localhost'
przez gniazdo, oczywiście).
Wniosek 3, z edycji 3: Mimo że podałem -ubill
, uzyskałem dostęp jako anonimowy użytkownik. Wynika to z „zasad sortowania” zalecanych powyżej. Zauważ, że w większości domyślnych instalacji istnieje anonimowy użytkownik bez hasła (i powinien zostać zabezpieczony / usunięty).
FLUSH PRIVILEGES
?