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

MySQL FEJL 1045 (28000):Adgang nægtet for brugeren 'bill'@'localhost' (ved hjælp af adgangskode:JA)

Du har sandsynligvis en anonym bruger ''@'localhost' eller ''@'127.0.0.1' .

I henhold til manualen :

Når flere matches er mulige, skal serveren bestemme, hvilken af ​​dem der skal bruges. Det løser dette problem som følger:(...)

  • Når en klient forsøger at oprette forbindelse, ser serveren gennem rækkerne [af tabellen mysql.user] i sorteret rækkefølge.
  • Serveren bruger den første række, der matcher klientens værtsnavn og brugernavn.

(...)Serveren bruger sorteringsregler, der sorterer rækker med de mest specifikke værtsværdier først .Literale værtsnavne [såsom 'localhost'] og IP-adresser er de mest specifikke.

Derfor ville en sådan anonym bruger "maske" enhver anden bruger som '[any_username]'@'%' når du opretter forbindelse fra localhost .

'bill'@'localhost' matcher 'bill'@'%' , men ville matche (f.eks.) ''@'localhost' på forhånd.

Den anbefalede løsning er at droppe denne anonyme bruger (det er normalt en god ting at gøre alligevel).

Redigeringerne nedenfor er for det meste irrelevante for hovedspørgsmålet. Disse er kun beregnet til at besvare nogle spørgsmål, der er rejst i andre kommentarer i denne tråd.

Rediger 1

Godkender som 'bill'@'%' gennem en stikkontakt.

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

Rediger 2

Præcis samme opsætning, bortset fra at jeg genaktiverede netværk, og jeg opretter nu en anonym bruger ''@'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)

Rediger 3

Samme situation som i edit 2, nu giver den anonyme brugers adgangskode.

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

Konklusion 1, fra redigering 1:Man kan autentificere som 'bill'@'%' gennem en stikkontakt.

Konklusion 2, fra redigering 2:Om man opretter forbindelse gennem TCP eller gennem en socket, har ingen indflydelse på godkendelsesprocessen (undtagen at man ikke kan oprette forbindelse som nogen anden end 'something'@'localhost' gennem en stikkontakt, naturligvis).

Konklusion 3, fra redigering 3:Selvom jeg specificerede -ubill , jeg har fået adgang som anonym bruger. Dette er på grund af "sorteringsreglerne" anbefalet ovenfor. Bemærk, at i de fleste standardinstallationer er et anonymt uden adgangskode bruger findes (og bør sikres/fjernes).



  1. Få årets dag fra en dato i SQL Server (T-SQL)

  2. Sådan konverteres UTC til lokal tid i MySQL

  3. Hvordan man fremskynder SELECT .. LIKE-forespørgsler i MySQL på flere kolonner?

  4. java.sql.SQLException:Adgang nægtet for brugeren 'root'@'localhost' (ved hjælp af adgangskode:JA)