Можливо, у вас є анонімний користувач ''@'localhost'
або ''@'127.0.0.1'
.
Відповідно до посібника :
Коли можливі кілька збігів, сервер повинен визначити, який із них використовувати. Це питання вирішує так: (...)
- Коли клієнт намагається підключитися, сервер переглядає рядки [таблиці mysql.user] у відсортованому порядку.
- Сервер використовує перший рядок, який відповідає імені хоста клієнта та імені користувача.
(...) Сервер використовує правила сортування, які спочатку упорядковують рядки з найбільш конкретними значеннями хосту . Буквальні імена хостів [такі як "localhost"] та IP-адреси є найбільш конкретними.
Отже, такий анонімний користувач "маскує" будь-якого іншого користувача, як, наприклад, '[any_username]'@'%'
під час з'єднання localhost
.
'bill'@'localhost'
відповідає 'bill'@'%'
, але відповідатиме (наприклад)''@'localhost'
заздалегідь.
Рекомендоване рішення - відмовитись від цього анонімного користувача (це зазвичай добре робити у будь-якому разі).
Нижче редагування в основному не стосуються головного питання. Вони призначені лише для відповіді на деякі запитання, поставлені в інших коментарях у цій темі.
Редагуйте 1
Аутентифікація як 'bill'@'%'
через розетку.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
Ласкаво просимо на монітор MySQL (...)
mysql> ВИБІР користувача, хостинг від mysql.user;
+ ------ + ----------- +
| користувач | хост |
+ ------ + ----------- +
| вексель | % |
| корінь | 127.0.0.1 |
| корінь | :: 1 |
| корінь | localhost |
+ ------ + ----------- +
4 ряди в наборі (0,00 сек)
mysql> SELECT USER (), CURRENT_USER ();
+ ---------------- + ---------------- +
| USER () | CURRENT_USER () |
+ ---------------- + ---------------- +
| рахунок @ localhost | рахунок @% |
+ ---------------- + ---------------- +
1 ряд у наборі (0,02 сек)
mysql> SHOW VARIABLES LIKE 'skip_networking';
+ ----------------- + ------- +
| Ім'я змінної | Значення |
+ ----------------- + ------- +
| skip_networking | ON |
+ ----------------- + ------- +
1 ряд у наборі (0,00 сек)
Редагувати 2
Точне налаштування, за винятком того, що я знову активував мережу, і тепер я створюю анонімного користувача ''@'localhost'
.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
Ласкаво просимо на монітор MySQL (...)
mysql> CREATE USER '' @ 'localhost' ІДЕНТИФІКІРОВАНО 'Anotherpass';
Запит OK, 0 рядків задіяно (0,00 сек)
mysql> До побачення
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket = / tmp / mysql-5.5.sock
ПОМИЛКА 1045 (28000): Відмовлено в доступі для користувача 'bill' @ 'localhost' (з використанням пароля: ТАК)
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol = TCP
ПОМИЛКА 1045 (28000): Відмовлено в доступі для користувача 'bill' @ 'localhost' (з використанням пароля: ТАК)
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol = TCP
ПОМИЛКА 1045 (28000): Відмовлено в доступі для користувача 'bill' @ 'localhost' (з використанням пароля: ТАК)
Правка 3
Така сама ситуація, що і в редакції 2, тепер надається пароль анонімного користувача.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
Ласкаво просимо на монітор MySQL (...)
mysql> SELECT USER (), CURRENT_USER ();
+ ---------------- + ---------------- +
| USER () | CURRENT_USER () |
+ ---------------- + ---------------- +
| рахунок @ localhost | @localhost |
+ ---------------- + ---------------- +
1 ряд у наборі (0,01 сек)
Висновок 1, з редагування 1: Аутентифікувати можна як 'bill'@'%'
через сокет.
Висновок 2, з редагування 2: Підключення через TCP або через сокет не впливає на процес аутентифікації (за винятком того, що один не може підключитися як ніхто інший, але 'something'@'localhost'
через сокет, очевидно).
Висновок 3, з редакції 3: Хоча я вказав -ubill
, мені було надано доступ як анонімний користувач. Це пов’язано з "правилами сортування", про які йшлося вище. Зауважте, що в більшості установок за замовчуванням анонімний користувач без пароля існує (і його слід захистити / видалити).
FLUSH PRIVILEGES
?