私は自分の Web サイト (CMS ベース) のユーザー データベースに対して認証しようとしていますが、ハッシュ化されたパスワードを保存する際にわずかに異なるアプローチを使用しています。ユーザーごとにランダムに生成されたソルトを使用します。ソルトは、ハッシュされたパスワードとともにユーザー データベースに格納されます。したがって、(外部 DB プラグインのように)直接のフィールド マップ認証は機能しません。
まず、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;
}
しかし、ログインしようとすると、Web サイト (CMS) データベースに対応するユーザー名/パスワードが失敗します。ただし、以前に (このカスタム プラグインを使用する前に) Moodle に保存されていた (同じユーザーの) パスワードはうまくいきます。
つまり、認証ルーチンが失敗しているか、moodle の内部データベース ベースの認証メカニズムが優先されています。
ADODB デバッグ モードを有効にしましたが、それも役に立ちません。サーバー設定からデバッグ出力を有効にすると、ページ ヘッダーの前にエラー メッセージが送信されます。したがって、ログイン ページはまったく表示されません。
他のすべての形式の認証をオフにしており (オフにできない手動を除く)、自分自身のものです。
この問題を解決する方法についてのアイデアはありますか?