sql >> Base de Datos >  >> RDS >> Mysql

MySQL ERROR 1045 (28000):Acceso denegado para el usuario 'bill'@'localhost' (con contraseña:SÍ)

Probablemente tenga un usuario anónimo ''@'localhost' o ''@'127.0.0.1' .

Según el manual :

Cuando son posibles varias coincidencias, el servidor debe determinar cuál de ellas usar. Resuelve este problema de la siguiente manera:(...)

  • Cuando un cliente intenta conectarse, el servidor busca en las filas [de la tabla mysql.user] en orden ordenado.
  • El servidor usa la primera fila que coincide con el nombre de host y el nombre de usuario del cliente.

(...) El servidor usa reglas de clasificación que ordenan las filas con los valores de Host más específicos primero .Nombres de host literales [como 'localhost'] y las direcciones IP son las más específicas.

Por lo tanto, dicho usuario anónimo "enmascararía" a cualquier otro usuario como '[any_username]'@'%' cuando se conecta desde localhost .

'bill'@'localhost' coincide con 'bill'@'%' , pero coincidiría (p. ej.) ''@'localhost' de antemano.

La solución recomendada es descartar a este usuario anónimo (esto suele ser bueno de todos modos).

Las siguientes ediciones son en su mayoría irrelevantes para la pregunta principal. Estos solo están destinados a responder algunas preguntas planteadas en otros comentarios dentro de este hilo.

Editar 1

Autenticación como 'bill'@'%' a través de un enchufe.

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

Editar 2

Exactamente la misma configuración, excepto que reactivé la red y ahora creo un usuario anónimo ''@'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)

Editar 3

Misma situación que en la edición 2, ahora proporcionando la contraseña del usuario anónimo.

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

Conclusión 1, de la edición 1:Uno puede autenticarse como 'bill'@'%' a través de un enchufe.

Conclusión 2, de la edición 2:si uno se conecta a través de TCP o a través de un socket no tiene impacto en el proceso de autenticación (excepto que uno no puede conectarse como nadie más que 'something'@'localhost' a través de un enchufe, obviamente).

Conclusión 3, de la edición 3:aunque especifiqué -ubill , se me ha concedido acceso como usuario anónimo. Esto se debe a las "reglas de clasificación" recomendadas anteriormente. Tenga en cuenta que en la mayoría de las instalaciones predeterminadas, un código anónimo sin contraseña el usuario existe (y debe asegurarse/quitarse).