Probabilmente hai un utente anonimo ''@'localhost'
o ''@'127.0.0.1'
.
Come da manuale :
Quando sono possibili più corrispondenze, il server deve determinare quale di esse utilizzare. Risolve questo problema come segue: (...)
- Quando un client tenta di connettersi, il server esamina le righe [della tabella mysql.user] in ordine ordinato.
- Il server utilizza la prima riga che corrisponde al nome host e al nome utente del client.
(...) Il server utilizza regole di ordinamento che ordinano per prime le righe con i valori Host più specifici . I nomi host letterali [come 'localhost'] e gli indirizzi IP sono i più specifici.
Quindi, un utente così anonimo "maschererebbe" qualsiasi altro utente come '[any_username]'@'%'
quando si connette localhost
.
'bill'@'localhost'
corrisponde 'bill'@'%'
, ma corrisponderebbe (ad esempio) ''@'localhost'
prima delle mani.
La soluzione consigliata è eliminare questo utente anonimo (questa è generalmente una buona cosa da fare comunque).
Le modifiche di seguito sono per lo più irrilevanti per la domanda principale. Questi servono solo per rispondere ad alcune domande sollevate in altri commenti all'interno di questa discussione.
Modifica 1
Autenticazione come 'bill'@'%'
tramite un socket.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
Benvenuti nel monitor MySQL (...)
mysql> SELEZIONA utente, host DA mysql.user;
+ ------ + ----------- +
| utente | host |
+ ------ + ----------- +
| fattura | % |
| radice | 127.0.0.1 |
| radice | :: 1 |
| radice | localhost |
+ ------ + ----------- +
4 righe in set (0,00 sec)
mysql> SELECT USER (), CURRENT_USER ();
+ ---------------- + ---------------- +
| UTENTE () | CURRENT_USER () |
+ ---------------- + ---------------- +
| bill @ localhost | fattura @% |
+ ---------------- + ---------------- +
1 riga in set (0,02 sec)
mysql> MOSTRA VARIABILI COME 'skip_networking';
+ ----------------- + ------- +
| Nome variabile | Valore |
+ ----------------- + ------- +
| skip_networking | ON |
+ ----------------- + ------- +
1 riga nel set (0,00 sec)
Modifica 2
Stessa configurazione, tranne che ho riattivato la rete e ora creo un utente anonimo ''@'localhost'
.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
Benvenuti nel monitor MySQL (...)
mysql> CREA UTENTE '' @ 'localhost' IDENTIFICATO DA 'anotherpass';
Query OK, 0 righe interessate (0.00 sec)
mysql> Ciao
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket = / tmp / mysql-5.5.sock
ERRORE 1045 (28000): Accesso negato per l'utente 'bill' @ 'localhost' (utilizzando la password: SÌ)
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol = TCP
ERRORE 1045 (28000): Accesso negato per l'utente 'bill' @ 'localhost' (utilizzando la password: SÌ)
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol = TCP
ERRORE 1045 (28000): Accesso negato per l'utente 'bill' @ 'localhost' (utilizzando la password: SÌ)
Modifica 3
Stessa situazione della modifica 2, fornendo ora la password dell'utente anonimo.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
Benvenuti nel monitor MySQL (...)
mysql> SELECT USER (), CURRENT_USER ();
+ ---------------- + ---------------- +
| UTENTE () | CURRENT_USER () |
+ ---------------- + ---------------- +
| bill @ localhost | @localhost |
+ ---------------- + ---------------- +
1 riga in set (0,01 sec)
Conclusione 1, dalla modifica 1: è possibile autenticarsi come 'bill'@'%'
tramite un socket.
Conclusione 2, dalla modifica 2: se uno si connette tramite TCP o tramite un socket non ha alcun impatto sul processo di autenticazione (tranne uno non può connettersi come chiunque altro ma 'something'@'localhost'
tramite un socket, ovviamente).
Conclusione 3, dalla modifica 3: Anche se ho specificato -ubill
, mi è stato concesso l'accesso come utente anonimo. Ciò è dovuto alle "regole di ordinamento" sopra indicate. Si noti che nella maggior parte delle installazioni predefinite esiste un utente anonimo senza password (che deve essere protetto / rimosso).
FLUSH PRIVILEGES
?