Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL ERROR 1045 (28000):accesso negato per l'utente 'bill'@'localhost' (usando la password:YES)

Probabilmente hai un utente anonimo ''@'localhost' o ''@'127.0.0.1' .

Come da il 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.
  • 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 le righe con prima i valori Host più specifici .Nomi host letterali [come 'localhost'] e gli indirizzi IP sono i più specifici.

Quindi, un tale utente anonimo "maschererebbe" qualsiasi altro utente come '[any_username]'@'%' quando ci si connette da localhost .

'bill'@'localhost' corrisponde a 'bill'@'%' , ma corrisponderebbe (ad es.) a ''@'localhost' in anticipo.

La soluzione consigliata è quella di eliminare questo utente anonimo (questa di solito è comunque una buona cosa da fare).

Le modifiche di seguito sono per lo più irrilevanti per la domanda principale. Questi hanno solo lo scopo di rispondere ad alcune domande sollevate in altri commenti all'interno di questo thread.

Modifica 1

Autenticazione come 'bill'@'%' tramite una presa.

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

Modifica 2

Stessa identica configurazione, tranne per il fatto che ho riattivato la rete e ora creo un utente anonimo ''@'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)

Modifica 3

Stessa situazione della modifica 2, ora fornendo la password dell'utente anonimo.

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

Conclusione 1, dalla modifica 1:ci si può autenticare come 'bill'@'%' tramite una presa.

Conclusione 2, dalla modifica 2:se ci si connette tramite TCP o tramite un socket non ha alcun impatto sul processo di autenticazione (tranne che non si può connettersi come nessun altro tranne 'something'@'localhost' tramite una presa, 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" consigliate sopra. Si noti che nella maggior parte delle installazioni predefinite, un anonimo senza password l'utente esiste (e dovrebbe essere protetto/rimosso).