Я пытаюсь пройти аутентификацию в базе данных пользователя моего веб-сайта (на основе CMS), и он использует немного другой подход к хранению хешированных паролей. Он использует случайно сгенерированную соль для каждого пользователя. Соль хранится в базе данных пользователя вместе с хешированными паролями. Следовательно, прямая проверка подлинности с сопоставлением полей (как это делает подключаемый модуль внешней базы данных) мне не подходит.
Для начала я просто зеркалировал плагин БД и модифицировал процедуру 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 ранее (до того, как я попытался использовать этот пользовательский плагин), помогает мне пройти.
Это означает, что либо моя процедура аутентификации не работает, либо внутренний механизм аутентификации на основе базы данных moodle имеет приоритет над ней.
Я включил режим отладки ADODB, но это тоже не помогает. Когда я включаю вывод отладки в настройках сервера, сообщения об ошибках отправляются перед заголовками страниц. Таким образом, страница входа вообще не будет отображаться.
У меня отключены все другие формы аутентификации (кроме ручной, которую нельзя отключить) и моя собственная.
Любые идеи о том, как решить эту проблему?