php mysqli_connect: istemci tarafından bilinmeyen kimlik doğrulama yöntemi [caching_sha2_password]


95

mysqli_connectMySQL veritabanına giriş yapmak için php kullanıyorum (tümü localhost'ta)

<?php
//DEFINE ('DB_USER', 'user2');
//DEFINE ('DB_PASSWORD', 'pass2');
DEFINE ('DB_USER', 'user1');
DEFINE ('DB_PASSWORD', 'pass1');
DEFINE ('DB_HOST', '127.0.0.1');
DEFINE ('DB_NAME', 'dbname');

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if(!$dbc){
    die('error connecting to database');    
}
?>

bu mysql.user tablosudur: mysql.user tablosu

MySQL Sunucusu ini Dosyası:

[mysqld]
# The default authentication plugin to be used when connecting to the server
default_authentication_plugin=caching_sha2_password
#default_authentication_plugin=mysql_native_password

ile caching_sha2_passwordMySQL Server ini dosyasında, hiç user1 veya kullanıcı2 ile giriş mümkün değildir;

hata: mysqli_connect (): Sunucu, içinde [caching_sha2_password] istemcisi tarafından bilinmeyen kimlik doğrulama yöntemi istedi ...

ile mysql_native_passwordMySQL Server ini dosyasında, bu ancak kullanıcı2, aynı hata ile, user1 ile giriş mümkündür;


caching_sha2_passwordmySql Sunucusunda kullanarak nasıl oturum açabilirim?


PDO bunu destekliyor mu? Hakkında başka raporlar da gördüm mysqli.
tadman

@ 黃皓哲 tarafından gönderilen cevap, kabul edilmiş cevap olarak işaretlenmelidir.
FIL

Yanıtlar:


53

PHP 7.4'ten itibaren bu artık bir sorun değildir. caching_sha2Mysqlnd'ye kimlik doğrulama yöntemi desteği eklendi.


Şu anda, PHP mysqli uzantısı yeni caching_sha2 kimlik doğrulama özelliğini desteklemiyor. Bir güncelleme yayınlayana kadar beklemelisiniz.

MySQL geliştiricilerinin ilgili gönderisini kontrol edin: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

PDO'dan bahsetmediler, belki de PDO ile bağlantı kurmayı denemelisiniz.



@Machavity bu cevabın hala geçerli olup olmadığını biliyor musunuz? Yani. daha yeni PHP sürümleriyle henüz güncel değil mi?
gen

@gen Bu hataya dayanarak, 7.4.2
Machavity

3
Php7.4'e yükseltme sorunu çözdü. Ve bence kimlik doğrulama yöntemini mysql_native_passwordbazı cevapların önerdiği şekilde değiştirmek yerine en iyi yaklaşım bu .
ultrasamad

Docker kullanıyorum (bir kapta apache + php ve başka bir kapta mysql) ve bu benim Sorunumu çözdü. Teşekkürler!
Joan Galmés Riera

227

Bunu SQL komutuyla çözüyorum:

ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

https://dev.mysql.com/doc/refman/8.0/en/alter-user.html tarafından başvurulan

yeni kullanıcı yaratıyorsanız

 CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

https://dev.mysql.com/doc/refman/8.0/en/create-user.html tarafından başvurulan

bu benim için çalışıyor


3
İyi cevap. Buradaki sorun şu ki, sunucu ayarlarına bağlı olarak her yeni kullanıcı eklediğinizde bunu yapmanız gerekebilir
Machavity

3
Çok teşekkür ederim Yeni şifre karmalarını eski olanlara dönüştürmenin bir yolunu arıyordum (sorudaki kullanıcı2 biçiminden kullanıcı1 biçimine gibi) ve cevabınız tam olarak işi yaptı
Muhasebeci م

10
Ve böylece php-7.2.9 / 11'in MySQL-8.012 ile iyi oynaması için 4 günlük bir mücadele sona erdi. PHP ekibinden biri bunu tarball'daki INSTALL'da not etmeye ikna edebilir mi? Önümüzdeki bir veya iki yıl içinde binlerce kişinin saatini kurtaracaktır.
MountainMan

4
@MountainMan Hayatımı Kurtardı
Chase

8
geçici çözüm için bu yanıt kabul edilmelidir
Yohanes AI

27
ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

Tırnak işaretlerini (') kaldırın ve tırnak işaretlerini (') sonra ALTER USERtutunmysql_native_password BY

Benim için de çalışıyor.


2
WAMP sunucusunu kullanarak localhost sunucusunda benim için çalışan tek çözüm buydu :)
Jodyshop

Bu, Mac'imin homebrew LAMP kurulumunda düzeltmiş gibi görünüyordu. Bu sorunu debian'da yaşamadım.
Magnus

22

Windows kullanıyorsanız ve hiç kullanamıyorsanız caching_sha2_password, aşağıdakileri yapabilirsiniz:

  1. MySQL Yükleyiciyi yeniden çalıştırın
  2. MySQL Sunucusunun yanındaki "Yeniden Yapılandır" ı seçin (en üst öğe)
  3. "Kimlik Doğrulama Yöntemi" ne gelene kadar "İleri" yi tıklayın
  4. "Kimlik Doğrulama için Güçlü Parola Şifreleme Kullan (ÖNERİLİR)" seçeneğini "Eski Kimlik Doğrulama Yöntemini Kullan (MySQL 5.X Uyumluluğunu Koru) olarak değiştirin
  5. Sonrakine tıkla"
  6. Kök Hesap Şifrenizi Hesaplar ve Roller'e girin ve "Kontrol Et" i tıklayın
  7. Sonrakine tıkla"
  8. "Yapılandırmayı Uygula" seçeneğine gelene kadar "İleri" yi tıklamaya devam edin
  9. "Yürüt" e tıklayın

Kurulumcu sizin için gerekli tüm yapılandırma değişikliklerini yapacaktır.


adam bu cevabı bir yıl yükselttikten sonra db'm hacklendi ...
Kod Ağacı

11

Benim için çalışıyor (PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64bits)

Dosyayı düzenleyin C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

Windows'ta ve MySQL Kabuğunda MySQL hizmetini sıfırlayın ...

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

işe yarıyor, teşekkürler ... 2 şeyi yapılandırmalıyız: mysql conf ve alter user
danisupr4

9

Birçok insan gibi ben de aynı sorunu yaşadım. Kullanıcı mysql_native_password kullanacak şekilde ayarlanmış olmasına ve komut satırından bağlanabilsem de, bağlanmak için mysqli () alabilmemin tek yolu eklemek

varsayılan kimlik doğrulama eklentisi = mysql_native_password

ubuntu 19.10, /etc/mysql/mysql.conf.d/mysqld.cnf üzerindeki kurulumumun [mysqld] bölümüne


2
Ayrıca, kullanıcı bu değişiklikten önce oluşturulursa çalışmayacağını unutmayın. Bu nedenle, İLK olarak yapılandırmada varsayılan kimlik doğrulamasını ayarlamalı ve daha sonra çalışmak için kullanıcıyı oluşturmalısınız!
Oleg Popov

4

ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';Komut satırında aşağıdaki komutu çalıştırdım ve sonunda MySQL'i yerel servislerde yeniden başlattım.


'root' @ 'localhost'bunun yerine buradaki boşluk okunmamalıdırALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
d1jhoni1b

4

Artık PHP7.4'e yükseltebilirsiniz ve MySQL caching_sha2_passwordvarsayılan olarak devam eder, bu nedenle varsayılan MySQL kurulumu mysqli_connectYapılandırma gerektirmeden çalışacaktır .


2
Pek değil. 7.4.0 ve 7.4.1'de buggy var. 7.4.2
Machavity

3

Mac kullanıyorsanız, nasıl düzelteceğiniz aşağıda açıklanmıştır. Bu tonlarca deneme yanılmadan sonra. Umarım bu başkalarına yardımcı olur ..

Hata ayıklama:

$mysql --verbose --help | grep my.cnf

$ which mysql
/usr/local/bin/mysql

Çözünürlük: nano /usr/local/etc/my.cnf

Ekle: default-authentication-plugin = mysql_native_password

-------
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
default-authentication-plugin=mysql_native_password
------

Nihayet Çalıştır: brew hizmetleri mysql'yi yeniden başlat


Buna ihtiyacım vardı ... Teşekkürler!
nykc

1

Bunu Ubuntu 18.04'te denedim ve benim için çalışan tek çözüm bu:

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

-4

Mysql sunucusunu caching_sha2_password şifrelemesi olmadan yapılandırmanın yararlı olmadığını düşünüyorum, ağ üzerinden güvenli bilgileri yayınlamanın, göndermenin veya elde etmenin bir yolunu bulmalıyız. Aşağıdaki kodda gördüğünüz gibi $ db_name değişkenini kullanmıyorum ve mysql sunucusunda standart yapılandırma şifresi olan bir kullanıcı kullanıyorum. Sadece bir Standart kullanıcı şifresi oluşturun ve tüm ayrıcalıkları yapılandırın. işe yarıyor, ama ayrım yapmadan nasıl söyledim.

<?php
$db_name="db";
$mysql_username="root";
$mysql_password="****";
$server_name="localhost";
$conn=mysqli_connect($server_name,$mysql_username,$mysql_password);

if ($conn) {
    echo "connetion success";
}
else{
    echo mysqli_error($conn);
}

?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.