我正在尝试对我网站的用户数据库(基于CMS)进行身份验证,并且它在存储散列密码时使用了稍微不同的方法。它为每个用户使用随机生成的盐。 salt与散列密码一起存储在用户数据库中。因此,直接的字段映射身份验证(如外部数据库插件那样)对我不起作用。
首先,我只是镜像了DB插件并修改了user_login()
过程以从数据库中读取散列密码和盐,然后再次使用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调试模式 - 但这也无济于事。当我从服务器设置启用调试输出时,错误消息将在页眉之前发送。因此,登录页面根本不会显示。
我关闭了所有其他形式的身份验证(除了手动无法关闭)和我自己的身份验证。
有关如何解决此问题的任何想法?
答案 0 :(得分:2)
您能否确认显示身份验证插件的顺序?这将决定它们的使用顺序。见..
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失败吗?
最后,您确定要以与首先创建的密码完全相同的方式生成加密密码吗?对我来说,这可能是问题的最可能原因。您是否可以控制盐渍密码的创建,以便您拥有新用户的创建和用户身份验证 - 这将确保您与生成盐渍密码和哈希的方式保持同步。