Вероятно имате анонимен потребител ''@'localhost'
или ''@'127.0.0.1'
.
Съгласно ръководството :
Когато са възможни множество съвпадения, сървърът трябва да определи кое от тях да използва. Той решава този проблем, както следва:(...)
- Когато клиент се опита да се свърже, сървърът преглежда редовете [на таблица mysql.user] в сортиран ред.
- Сървърът използва първия ред, който съответства на името на хоста на клиента и потребителското име.
(...)Сървърът използва правила за сортиране, които подреждат редове с първо най-специфичните стойности на хоста .Литерални имена на хост [като 'localhost'] и IP адресите са най-конкретни.
Следователно такъв анонимен потребител би "маскирал" всеки друг потребител като '[any_username]'@'%'
при свързване от localhost
.
'bill'@'localhost'
отговаря на 'bill'@'%'
, но ще съвпада (напр.) ''@'localhost'
предварително.
Препоръчителното решение е да премахнете този анонимен потребител (така или иначе това обикновено е добре).
Редакциите по-долу са предимно неотносими към основния въпрос. Те са предназначени само да отговорят на някои въпроси, повдигнати в други коментари в тази тема.
Редактиране 1
Удостоверяване като 'bill'@'%'
през контакт.
[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)
Редактиране 2
Точно същата настройка, с изключение на това, че активирах отново работата в мрежа и сега създавам анонимен потребител ''@'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)
Редактиране 3
Същата ситуация като в редакция 2, сега предоставя паролата на анонимния потребител.
[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)
Заключение 1, от редакция 1:Човек може да се удостовери като 'bill'@'%'
през контакт.
Заключение 2, от редакция 2:Дали човек се свързва чрез TCP или чрез сокет няма влияние върху процеса на удостоверяване (освен не може да се свърже като всеки друг освен 'something'@'localhost'
през гнездо, очевидно).
Заключение 3, от редакция 3:Въпреки че посочих -ubill
, получих достъп като анонимен потребител. Това се дължи на "правилата за сортиране", препоръчани по-горе. Забележете, че в повечето инсталации по подразбиране без парола, анонимен потребител съществува
(и трябва да бъде защитен/премахнат).