【问题标题】:Need help debugging a custom authentication plugin for Moodle需要帮助调试 Moodle 的自定义身份验证插件
【发布时间】:2009-11-16 09:47:23
【问题描述】:

我正在尝试针对我的网站(基于 CMS)的用户 db 进行身份验证,它使用稍微不同的方法来存储散列密码。它为每个用户使用随机生成的盐。 salt 与散列密码一起存储在用户数据库中。因此,直接字段映射身份验证(如外部数据库插件所做的那样)对我不起作用。

首先,我只是镜像了 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 调试模式 - 但这也无济于事。当我从服务器设置启用调试输出时,错误消息会在页眉之前发送。因此登录页面根本不会显示。

我已关闭所有其他形式的身份验证(除了无法关闭的手动)和我自己的。

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: database authentication plugins external moodle


    【解决方案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 的调用失败了吗?

    最后,您确定生成加盐密码的方式与最初创建的方式完全相同吗?对我来说,这将是问题的最可能原因。您能否控制加盐密码的创建,以便您同时拥有新用户的创建和用户身份验证 - 这将确保您与加盐密码和哈希的生成方式保持同步。

    【讨论】:

    • 感谢您的回复...我将逐步查看您的建议并回复您..
    • 你好。我尝试始终返回“true”,并且还注释掉了 update_user_record() 的整个代码块。但是,我仍然不断收到无效登录。至于auth插件的顺序,是1.Manual Accounts,2.Nologin,3.my custom plugin。我在这里看不到更改插件顺序的选项......虽然表中有一个标题为 Up/Down 的列,但该列不包含任何内容。有什么建议吗?
    • 忘了说:mdl_config 表中的“auth”选项设置为我的插件。
    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 2020-12-11
    • 2015-09-11
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    相关资源
    最近更新 更多