Нужна помощь в отладке пользовательского плагина аутентификации для Moodle - PullRequest
1 голос
/ 16 ноября 2009

Я пытаюсь пройти аутентификацию на уровне пользователя db моего сайта (на основе 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 ранее (до того, как я попытался использовать этот пользовательский плагин), помогает мне.

Это означает, что либо моя процедура аутентификации не работает, либо внутренний механизм аутентификации, основанный на базе данных moodle, имеет приоритет над ней.

Я включил Режим отладки ADODB - но это тоже не помогает. Когда я включаю вывод отладки в настройках Сервера, сообщения об ошибках отправляются до заголовков страниц. Таким образом, страница входа не будет отображаться вообще.

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

Есть идеи, как решить эту проблему?

1 Ответ

2 голосов
/ 16 декабря 2009

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

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?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...