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.

    example@sqldat.com:/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() |
    +----------------+----------------+
    | example@sqldat.com | example@sqldat.com%         |
    +----------------+----------------+
    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' .

    example@sqldat.com:/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

    example@sqldat.com:/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)
    example@sqldat.com:/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)
    example@sqldat.com:/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.

    example@sqldat.com:/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() |
    +----------------+----------------+
    | example@sqldat.com | @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)