Опитвам се да се удостоверя срещу потребителската база данни на моя уебсайт (базиран на CMS) и той използва малко по-различен подход при съхраняване на хеширани пароли. Той използва произволно генерирана сол за всеки потребител. Солта се съхранява в потребителската база данни заедно с хешираните пароли. Следователно директното картографирано удостоверяване на полето (както прави добавката за външна база данни) няма да работи за мен.
За да започна, просто дублирах приставката за DB и модифицирах процедурата user_login()
, за да прочета хешираната парола и солта от базата данни и след това да хеширам въведената парола отново със солта и да я съпоставя с паролата в базата данни. Ето кода за моята функция user_login()
function user_login($username, $password) {
global $CFG;
$textlib = textlib_get_instance();
$extusername = $textlib->convert(stripslashes($username), 'utf-8', $this->config->extencoding);
$extpassword = $textlib->convert(stripslashes($password), 'utf-8', $this->config->extencoding);
$authdb = $this->db_init();
// normal case: use external db for passwords
// Get user data
$sql = "SELECT
*
FROM {$this->config->table}
WHERE {$this->config->fielduser} = '".$this->ext_addslashes($extusername)."' ";
$authdb->SetFetchMode(ADODB_FETCH_ASSOC);
// No DB Connection
if ( !$rs = $authdb->Execute( $sql ) ) {
$authdb->Close();
print_error('auth_dbcantconnect','auth');
return false;
}
// No records returned
if( $rs->EOF ) {
$rs->Close();
$authdb->Close();
return false;
}
// Get password
$db_password = $rs->fields['user_password'];
$salt = $rs->fields['user_salt'];
// Close DB Conn
$rs->Close();
$authdb->Close();
// Return match
return sha1( $extpassword . $salt ) == $db_password;
}
Но когато се опитвам да вляза, потребителското име/паролите, съответстващи на базата данни на уебсайта (CMS), се провалят. Обаче паролата (за същия потребител), която беше съхранена в Moodle по-рано (преди да опитам да използвам този персонализиран плъгин), ми помага.
Това означава, че или моята процедура за удостоверяване е неуспешна, или вътрешният механизъм за удостоверяване, базиран на db, има предимство пред нея.
Активирах ADODB режим на отстраняване на грешки - но и това не помага. Когато активирам изхода за отстраняване на грешки от настройките на сървъра, съобщенията за грешка се изпращат преди заглавките на страниците. Така страницата за вход изобщо няма да се показва.
Имам изключени всички други форми на удостоверяване (с изключение на ръчното, което не може да се изключи) и моята собствена.
Някакви идеи как да се реши този проблем?