Нужна помощь в отладке пользовательского плагина аутентификации для Moodle

Я пытаюсь пройти аутентификацию в базе данных пользователя моего веб-сайта (на основе 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, но это тоже не помогает. Когда я включаю вывод отладки в настройках сервера, сообщения об ошибках отправляются перед заголовками страниц. Таким образом, страница входа вообще не будет отображаться.

У меня отключены все другие формы аутентификации (кроме ручной, которую нельзя отключить) и моя собственная.

Любые идеи о том, как решить эту проблему?


person miCRoSCoPiC_eaRthLinG    schedule 16.11.2009    source источник


Ответы (1)


Можете ли вы подтвердить порядок отображения подключаемых модулей аутентификации? Это определит порядок их использования. Видеть..

http://docs.moodle.org/en/Manage_authentication

В любом случае, поведение, которое вы видите, предполагает, что ваш код возвращает false и логика провала, описанная здесь...

http://moodle.org/mod/forum/discuss.php?d= 102070

... и тут...

http://docs.moodle.org/en/Development:Authentication_plugins

... заводится.

Вы пытались всегда возвращать «true» из вашего плагина, чтобы убедиться, что он вызывается. Затем вы можете начать возвращать «true» на основе других вещей (жестко закодированных имен пользователей и т. д.). Этот подход позволит вам добраться до точки, где вы либо продолжаете терпеть неудачи, либо видите больше целенаправленных ошибок. Вы уверены, например, что сбой вызывает функция user_login, а не последующий вызов update_user_record?

Наконец, вы уверены, что создаете соленый пароль точно так же, как он был создан изначально? Для меня это была бы наиболее вероятная причина проблемы. Можете ли вы взять под контроль создание соленого пароля, чтобы вы владели как созданием новых пользователей, так и аутентификацией пользователей - это обеспечит синхронизацию с тем, как были сгенерированы соленый пароль и хэш.

person Martin Peck    schedule 16.12.2009
comment
Спасибо за ваш ответ... Я рассмотрю ваши предложения шаг за шагом и свяжусь с вами.. - person miCRoSCoPiC_eaRthLinG; 17.12.2009
comment
Привет. Я пытался всегда возвращать true, а также закомментировал весь блок кода для update_user_record(). Тем не менее, я все еще продолжаю получать неверный логин. Что касается порядка плагинов авторизации, то это 1. Учетные записи вручную, 2. Nologin и 3. мой пользовательский плагин. Я не вижу здесь возможности изменить порядок плагинов... хотя в таблице есть столбец с названием «Вверх/вниз», он ничего не содержит. Какие-либо предложения ? - person miCRoSCoPiC_eaRthLinG; 21.12.2009
comment
Забыл упомянуть: опция auth в таблице mdl_config установлена ​​для моего плагина. - person miCRoSCoPiC_eaRthLinG; 21.12.2009