簡體   English   中英

Java GSSAPI:比較兩個GSSCredential實例

[英]Java GSSAPI: Compare two GSSCredential Instances

我的代碼當前可以為我的網站用戶執行SPNEGO(Kerberos)身份驗證正常運行。 我有一個特殊的緩存機制,可以根據對用戶身份的確認來加速某些決策。 對於普通密碼身份驗證,這非常簡單-將“當前”用戶+密碼組合與“舊”用戶組合進行比較-如果沒有更改,則仍可以緩存決策。 否則,需要對其進行重新評估。

我正在嘗試對Kerberos做同樣的事情。 我大部分都在工作,但是我對GSSCredential.equals()為什么不工作感到困惑。 特別是,我對每個請求進行身份驗證后獲得的GSSCredential實例是“相同的”,因為它們是針對同一用戶,同一服務的,甚至是在相同情況下獲得的(我認為)。 如果我執行toString()並且比較輸出,則它們是相同的(是的,我知道這是無關緊要的,但這仍然很好地表明了它們可能應該相等)。

但是, GSSCredential_1.equals(GSSCredential_2)在請求之間始終返回false。 這可能是因為每個票證都是使用不同的SPNEGO票證獲得的(根據Kerberos,這是必需的,以避免重播場景),但是這些票證仍屬於同一主體,並且被“瞄准”了相同的服務主體。

我需要做出的代碼決定最好是這樣表達的:

這些新憑證代表與以前使用的相同的安全主體嗎? 到期問題,目的有效性問題以及未得到解決的問題將分別進行評估,然后再進行評估。

比較他們的名字“有效”,但我希望有一些更強大的東西。

有任何想法嗎?

根據javadocs的GSSCredentials.equals方法

測試此GSSCredential是否斷言與提供的對象相同的實體。 這兩個憑證必須通過相同的機制獲取,並且必須引用相同的主體。

使用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 (機制)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM