2012-04-23 13 views
1

私のコードは現在、自分のWebサイトのユーザーに対してSPNEGO(Kerberos)認証を実行しています。私は、ユーザーの身元の確認に基づいていくつかの決定を加速する特別なキャッシュメカニズムを用意しています。単純なパスワード認証の場合、これは簡単です。「現在の」ユーザーとパスワードのコンボを「古い」パスワードのコンボと比較します。変更がなければ、依然としてキャッシュできます。それ以外の場合は、再評価する必要があります。Java GSSAPI:2つのGSSCredentialインスタンスの比較

私はKerberosで同じことをしようとしています。私はそれが主に働いているが、私はなぜGSSCredential.equals()がうまくいかないとうんざりしている。特に、私が各リクエストを認証した後に取得するGSSCredentialインスタンスは、同じユーザー、同じサービス、同じ状況(たとえ)で取得されたものであっても同じです。 toString()を実行して出力を比較すると、それらは同じです(はい、これは無関係ですが、それでも同じでなければならないという良い指標です)。

ただし、GSSCredential_1.equals(GSSCredential_2)は、要求間に常にfalseを返します。これは、それぞれが異なるSPNEGOチケット(リプレイシナリオを避けるためにKerberosのように必要です)を使用して取得されたものですが、それらのチケットは同じプリンシパルに属し、同じサービスプリンシパルに「目標」されているためです。

私は最高のような関節結合されていることを確認する必要があるコードの決定:

は、これらの新しい資格情報が以前に使用したものと同じセキュリティプリンシパルを表していますか?期限切れ、目的のための妥当性およびその他のものの質問は、別々に評価されます。

名前を比較すると「うまくいく」と思っていましたが、もう少し頑強なものを望んでいました。

アイデア?

+0

名前を比較するよりも優れているとは思えません。それが失敗するシナリオがありますか? –

答えて

0

このGSSCredentialが指定されたオブジェクトと同じエンティティをアサートする場合GSSCredentials.equalsメソッドのJavadoc

試験に従って。 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を返しますよということを示しています。 GSSNameOid(メカニズム)の両方を比較する必要があると思います。

関連する問題