[英]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。 因此,我想您需要同時比較GSSName
和Oid
(機制)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.