我正在尝试对我的网站(基于 CMS)的用户 db 进行身份验证,它使用稍微不同的方法来存储散列密码。它为每个用户使用随机生成的盐。salt 与散列密码一起存储在用户数据库中。因此,直接字段映射身份验证(如外部数据库插件所做的那样)对我不起作用。
首先,我只是镜像了 DB 插件并修改了user_login()
程序以从数据库中读取哈希密码和 salt,然后再次使用 salt 对输入的密码进行哈希处理,并将其与数据库中的密码匹配。这是我的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 调试模式——但这也无济于事。当我从服务器设置启用调试输出时,错误消息会在页眉之前发送。因此登录页面根本不会显示。
我关闭了所有其他形式的身份验证(除了无法关闭的手动)和我自己的。
关于如何解决这个问题的任何想法?