2

私は自分の 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 デバッグ モードを有効にしましたが、それも役に立ちません。サーバー設定からデバッグ出力を有効にすると、ページ ヘッダーの前にエラー メッセージが送信されます。したがって、ログイン ページはまったく表示されません。

他のすべての形式の認証をオフにしており (オフにできない手動を除く)、自分自身のものです。

この問題を解決する方法についてのアイデアはありますか?

4

1 に答える 1

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 の呼び出しではないということは確かですか?

最後に、最初に作成されたのとまったく同じ方法でソルト化されたパスワードを生成していますか? これは、私にとって、問題の最も可能性の高い原因です。新しいユーザーの作成とユーザーの認証の両方を所有するように、ソルトされたパスワードの作成を制御できますか?これにより、ソルトされたパスワードとハッシュがどのように生成されたかと確実に同期できます。

于 2009-12-16T16:06:24.823 に答える