1

私のコードは現在、私の Web サイトのユーザーに対して SPNEGO (Kerberos) 認証を実行しても問題なく動作します。ユーザーの身元の確認に基づいていくつかの決定を加速するために、特別なキャッシュメカニズムが用意されています。単純なパスワード認証の場合、これは非常に簡単です。「現在の」ユーザーとパスワードの組み合わせを「古い」ものと比較します。変更がない場合、決定は引き続きキャッシュできます。それ以外の場合は、再評価する必要があります。

Kerberos についても同じことをしようとしています。私はそれをほとんど機能させましたが、なぜGSSCredential.equals()機能しないのか困惑しています。特に、各リクエストを認証した後に取得した GSSCredential インスタンスは、同じユーザー、同じサービス、同じ状況で取得されたものであるという点で「同一」です (と思います)。a を実行しtoString()て出力を比較すると、それらは同じです (はい、これは無関係であることはわかっていますが、おそらく等しいはずであるということはまだ良い兆候です)。

ただし、GSSCredential_1.equals(GSSCredential_2)リクエスト間では常に false を返します。これは、それぞれが異なる SPNEGO チケット (リプレイ シナリオを回避するために Kerberos に従って必要) を使用して取得されている可能性がありますが、それらのチケットは依然として同じプリンシパルに属しており、同じサービス プリンシパルを「対象」としていました。

私が行う必要があるコードの決定は、次のように表現するのが最適です。

これらの新しい資格情報は、以前に使用されたものと同じセキュリティ プリンシパルを表していますか? 有効期限、目的に対する有効性などの問題は、個別に評価され、後で評価されます。

それらの名前を比較すると「うまくいきます」が、もう少し堅牢なものを望んでいました。

何か案は?

4

1 に答える 1

0

GSSCredentials.equals メソッドの javadoc によると

この GSSCredential が提供されたオブジェクトと同じエンティティを表明しているかどうかをテストします。2 つの資格情報は、同じメカニズムで取得する必要があり、同じプリンシパルを参照する必要があります。

equals メソッドを使用するだけで十分です。ただし、実装を見ると、奇妙な動作の背後にある理由が示されます。

public boolean equals(Object another) {

    if (destroyed) {
        throw new IllegalStateException("This credential is " +
                                    "no longer valid");
    }

    if (this == another) {
        return true;
    }

    if (!(another instanceof GSSCredentialImpl)) {
        return false;
    }

    // NOTE: The specification does not define the criteria to compare
    // credentials.
    /*
     * XXX
     * The RFC says: "Tests if this GSSCredential refers to the same
     * entity as the supplied object.  The two credentials must be
     * acquired over the same mechanisms and must refer to the same
     * principal.  Returns "true" if the two GSSCredentials refer to
     * the same entity; "false" otherwise."
     *
     * Well, when do two credentials refer to the same principal? Do
     * they need to have one GSSName in common for the different
     * GSSName's that the credential elements return? Or do all
     * GSSName's have to be in common when the names are exported with
     * their respective mechanisms for the credential elements?
     */
    return false;
}

これは、まったく同じオブジェクト インスタンスを提供した場合にのみ true が返されることを明確に示しています。GSSNameしたがって、とOid(メカニズム)の両方を比較する必要があると思います。

于 2012-04-25T10:54:43.070 に答える