Mengizinkan akses wildcard (%) di MySQL db, mendapatkan kesalahan “akses ditolak untuk '<user>' @ 'localhost'”

16

Saya telah membuat basis data dan pengguna, dan mengizinkan akses melalui yang berikut:

create user 'someuser'@'%' identified by 'password';
grant all privileges on somedb.* to 'someuser' with grant option;

Namun, ketika saya mencoba untuk terhubung ke MySQL saya mendapatkan kesalahan berikut:

$ mysql -u someuser -p
> Enter Password:
> ERROR 1045 (28000): Access denied for user 'someuser'@'localhost' (using password: YES)

Jika "%" adalah wildcard, bukankah itu juga akan mengaktifkan localhost? Namun, jika saya tidak menentukan bahwa saya ingin menggunakan kata sandi, maka saya dapat terhubung dengan baik ke database, yang tidak masuk akal karena saya menentukan kata sandi ketika saya membuat pengguna.

Wayne Molina
sumber

Jawaban:

16

Coba sambungkan dengan mysql -u someuser -p -h 127.0.0.1.

Jika Anda dapat terhubung tanpa kata sandi, Anda telah menyimpan kredensial di .my.cnf atau Anda telah membuat akun yang memungkinkan akses tanpa kata sandi.


Komentar dari dokumen mysql ini mungkin juga terkait.

http://dev.mysql.com/doc/refman/5.1/en/access-denied.html

Jika Anda tidak dapat mengetahui mengapa Anda mendapatkan Access ditolak, hapus dari tabel pengguna semua entri yang memiliki nilai Host yang berisi wildcard (entri yang berisi karakter '%' atau '_'). Kesalahan yang sangat umum adalah menyisipkan entri baru dengan Host = '%' dan User = 'some_user', berpikir bahwa ini memungkinkan Anda untuk menentukan localhost untuk terhubung dari mesin yang sama. Alasan mengapa ini tidak berhasil adalah karena hak akses default menyertakan entri dengan Host = 'localhost' dan User = ''. Karena entri itu memiliki nilai Host 'localhost' yang lebih spesifik daripada '%', ia digunakan sebagai preferensi terhadap entri baru ketika menghubungkan dari localhost! Prosedur yang benar adalah memasukkan entri kedua dengan Host = 'localhost' dan Pengguna = 'some_user',

Sakit kepala
sumber
+1 termasuk definisi host & ~ / .my.cnf referensi
Andy
7

Saya cukup yakin Anda membutuhkan yang berikut ini:

berikan semua hak istimewa pada suatu hari * untuk 'someuser' @ '%' dengan opsi hibah;

Pernyataan GRANT Anda tidak memiliki deklarasi nama host.

Monyet Asinine
sumber
Lokasi harus ditentukan:GRANT ALL ON somedb.* TO 'someuser'@'10.1.10.1';
tacotuesday
6

Jika Anda tidak dapat terhubung ke mysql menggunakan someuser @ '%' di mana '%' adalah wildcard untuk nama host, maka pastikan Anda tidak memiliki '' @localhost entri di tabel pengguna Anda. Konfirmasikan menggunakan pernyataan SQL berikut:

    mysql> SELECT * FROM user WHERE user='' AND host='localhost';

Jika '' @ localhost ada, maka hapus dengan mengeluarkan pernyataan SQL berikut:

    mysql> DELETE FROM user WHERE user='' AND host='localhost';

lalu yang terakhir

    FLUSH PRIVILEGES;

Sekarang someuser @ '%' akan terhubung ke database.

Alphonse Ogulla
sumber
Memberi hak istimewa 'username' @ 'localhost' tidak akan menyebabkan hibah pada pengguna yang sama dari lokasi yang berbeda tidak berfungsi.
tacotuesday
bagaimana ini relevan? apa yang menyebabkan '' pengguna di 'localhost'?
Steve Buzonas
1
@SteveBuzonas Ini benar-benar relevan. Ini memberikan contoh kode untuk jawaban yang diposting Zoredache. Localhost lebih spesifik daripada '%', jadi jika Anda mencoba untuk terhubung melalui localhost dengan pengguna yang hanya memiliki akses di '%', entri localhost lebih spesifik, jadi mysql mencoba login di localhost, tetapi mengharapkan nama pengguna kosong dan kata sandi kosong Karena itu bukan kredensial yang diberikan, Anda mendapatkan kesalahan akses ditolak. Dengan menghapus entri ini, ini memungkinkan akses untuk pengguna di '%'.
bstakes
@memastikan perilaku default klien mysql adalah menggunakan nama pengguna shell Anda jika Anda tidak menentukan satu. pertanyaan memiliki pengguna dalam contoh dan pesan kesalahan. saya ingin tahu bagaimana seorang pengguna akan berkonflik dengan seorang pengguna yang disebutkan namanya. Apakah 'wildcard'?
Steve Buzonas
@SteveBuzonas '' berfungsi seperti wildcard sehubungan dengan localhost. Dari MySQL Documents dan ditampilkan dalam jawaban di atas yang merujuk pada default yang Anda sebutkan: "Karena entri itu memiliki nilai Host 'localhost' yang lebih spesifik daripada '%', itu digunakan dalam preferensi ke entri baru ketika menghubungkan dari localhost ! Prosedur yang benar adalah menyisipkan entri kedua dengan Host = 'localhost' dan User = 'some_user', atau untuk menghapus entri dengan Host = 'localhost' dan User = ''. "
bstakes
4

Pemahaman saya, dan saya siap untuk diperbaiki, adalah bahwa MySQL memperlakukan localhost secara terpisah menjadi%. yaitu localhost tidak termasuk dalam wildcard.

John Gardeniers
sumber
Contoh-contoh yang disediakan di dev.mysql.com/doc/refman/5.1/en/connection-access.html membuat saya percaya ini mungkin tidak akurat. Apakah Anda memiliki referensi?
Warner
Pemahaman saya tentang masalah ini didasarkan pada orang lain yang melaporkan masalah yang sama, baik di media cetak maupun secara verbal, dan menyelesaikannya dengan membuat 2 pengguna, menggunakan "%" dan "localhost". Saya tidak ingat pernah benar-benar melihatnya secara resmi didokumentasikan.
John Gardeniers
1
Ini tampaknya benar di Ubuntu setidaknya 12,04 LTS
Dex
Apa yang terjadi pada saya adalah yang saya miliki user@%dan tidak berhasil sampai saya termasuk user@localhost. Kemudian saya melihat jawabannya stackoverflow.com/a/29421084/4850646 dan menyadari bahwa saya memiliki pengguna anonim dengan host localhost. Saya menghapus semua pengguna anonim dan dapat mengakses dari localhostuntuk pengguna itu, bahkan setelah menghapus user@localhost (dan hanya membiarkan user@%). Tampaknya karena localhostlebih spesifik daripada %, ia mencoba terlebih dahulu localhostpengguna, bahkan jika itu adalah pengguna anonim!
Lucas Basquerotto
0

Sudahkah Anda menjalankan flush privileges;setelah membuat pengguna? Jika tidak, perubahan pada pengguna / izin tidak akan berlangsung hingga server dimulai ulang.

Kemudian, periksa Anda tidak memiliki entri '%' @ 'localhost'.

Caelyx
sumber
4
menggunakan 'buat pengguna' dan 'berikan' secara otomatis menghapus hak istimewa. Anda hanya perlu menghapus hak istimewa jika Anda secara langsung memanipulasi database mysql.
Zoredache