Anda mungkin memiliki pengguna anonim ''@'localhost'
atau ''@'127.0.0.1'
.
Sesuai manual :
Ketika beberapa kecocokan dimungkinkan, server harus menentukan mana yang akan digunakan. Ini menyelesaikan masalah ini sebagai berikut:(...)
- Ketika klien mencoba untuk terhubung, server melihat melalui baris [tabel mysql.user] dalam urutan yang diurutkan.
- Server menggunakan baris pertama yang cocok dengan nama host dan nama pengguna klien.
(...)Server menggunakan aturan pengurutan yang mengurutkan baris dengan nilai Host paling spesifik terlebih dahulu .Nama host harfiah [seperti 'localhost'] dan alamat IP adalah yang paling spesifik.
Oleh karena itu, pengguna anonim seperti itu akan "menutupi" pengguna lain seperti '[any_username]'@'%'
saat menghubungkan dari localhost
.
'bill'@'localhost'
cocok dengan 'bill'@'%'
, tetapi akan cocok (mis.) ''@'localhost'
sebelumnya.
Solusi yang disarankan adalah menghapus pengguna anonim ini (biasanya ini adalah hal yang baik untuk dilakukan).
Suntingan di bawah ini sebagian besar tidak relevan dengan pertanyaan utama. Ini hanya dimaksudkan untuk menjawab beberapa pertanyaan yang diajukan di komentar lain dalam utas ini.
Edit 1
Mengautentikasi sebagai 'bill'@'%'
melalui soket.
[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)
Edit 2
Pengaturan yang sama persis, kecuali saya mengaktifkan kembali jaringan, dan sekarang saya membuat pengguna anonim ''@'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)
Edit 3
Situasi yang sama seperti di edit 2, sekarang memberikan kata sandi pengguna anonim.
[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)
Kesimpulan 1, dari edit 1:Seseorang dapat mengautentikasi sebagai 'bill'@'%'
melalui soket.
Kesimpulan 2, dari edit 2:Apakah seseorang terhubung melalui TCP atau melalui soket tidak berdampak pada proses otentikasi (kecuali seseorang tidak dapat terhubung sebagai orang lain selain 'something'@'localhost'
melalui soket, tentu saja).
Kesimpulan 3, dari edit 3:Meskipun saya menentukan -ubill
, Saya telah diberikan akses sebagai pengguna anonim. Ini karena "aturan penyortiran" yang disarankan di atas. Perhatikan bahwa di sebagian besar penginstalan default, tanpa kata sandi, anonim pengguna ada
(dan harus diamankan/dihapus).