Saya menghabiskan beberapa hari menyelesaikan masalah beberapa kegagalan pengesahan kata laluan dalam Laravel 9. Kata laluan testperson
解析为哈希值 yxc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW
. Pertanyaan langsung jadual pangkalan data yang sepadan mengesahkan bahawa ini ialah nilai cincang yang betul. Walau bagaimanapun infrastruktur pengesahan Laravel menolak kata laluan ini dan menolak pengesahan.
Ini bukan perkara biasa. Saya mempunyai berbilang kata laluan yang menghuraikan dengan betul. Contohnya, kata laluan eo
解析为 y$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2
, dan Laravel akan mengesahkan kata laluan itu. Mekanisme yang sama mencipta kedua-dua rekod pengguna, walaupun mereka mempunyai kebenaran yang berbeza (ditunjukkan oleh nilai boolean pada rekod).
Saya menemui pepijat dalam fungsi password_verify
yang dikenal pasti sebagai mengembalikan negatif palsu dalam soalan Stack Overflow ini dan urutan Treehouse ini.
Secara khusus, ini ialah timbunan dalam Laravel di mana titik kegagalan ini berlaku:
login
路由通过控制器类调用 IlluminateFoundationAuthAuthenticatesUsers::login
. login
方法调用 IlluminateFoundationAuthAuthenticatesUsers::attemptLogin
. attemptLogin
方法调用控制器守卫对象的 attempt
Kaedah. IlluminateAuthSessionGuard::attempt
调用 IlluminateAuthSessionGuard::hasValidCredentials
. IlluminateAuthSessionGuard::hasValidCredentials
调用守卫提供者对象上的 validateCredentials
Kaedah. IlluminateAuthEloquentUserProvider::validateCredentials
在其 hasher 对象上调用 check
Kaedah. IlluminateHashingHashManager::check
在其驱动程序上调用 check
Kaedah. IlluminateHashingBcryptHasher::check
调用 IlluminateHashingAbstractHasher::check
. IlluminateHashingAbstractHasher::check
panggilan IlluminateHashingAbstractHasher::check
调用 password_verify
. Selepas mengembangkan keseluruhan tindanan, saya menjalankan kod berikut dalam kaedah login
pengawal log masuk:
$provider = $this->guard()->getProvider(); $credentials = $this->credentials($request); $user = $provider->retrieveByCredentials($credentials); $password_unhashed = $request['password']; $password_hashed = $user->getAuthPassword(); $password_verify = password_verify($password_unhashed, $password_hashed); logger('attemping login', compact('password_verify','password_unhashed','password_hashed'));
Buang konteks ini:
{ "password_verify": false, "password_unhashed": "testperson", "password_hashed": "yxc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW" }
Jika saya memasukkan kata laluan itu ke dalam pertanyaan SELECT users WHERE password=
, saya mendapat pengguna yang saya harapkan.
Apa yang sedang berlaku? Bagaimanakah saya boleh menyelesaikan masalah ini?
Saya rasa dakwaan anda bahawa hash yang anda berikan adalah hash "penguji" sebenarnya salah. Memandangkan cincangan adalah sehala, saya tidak dapat memberitahu anda dari mana datangnya cincangan yang ditunjukkan. NOTA: Ia berfungsi pada PHP 7.4, tetapi saya rasa ia tidak akan berfungsi pada PHP 8 dan ke atas kerana pilihan garam dalam passwd_hash() tidak digunakan lagi.