本文介紹了使用Java客戶端進行單點登錄的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在尋找Java客戶端中的單點登錄身份驗證。
因為我是使用AD登錄到Windows的,所以主要目標是我不必再次輸入用戶名和密碼。我想讓Java使用我在Windows登錄時收到的票證。此代碼是我擁有的最適合此用途的代碼:
LoginContext lc = new LoginContext("com.sun.security.jgss.krb5.initiate", new DialogCallbackHandler());
lc.login();
Subject.doAs(lc.getSubject(), (PrivilegedExceptionAction<Void>) () -> {
System.out.println("This is privileged");
return null;
});
我已經用相應的配置文件設置了java.security.krb5.conf
和java.security.auth.login.config
屬性,但是仍然彈出要求輸入用戶名和密碼的對話框。
我也嘗試使用GSSName
,但GSSManager.createCredential()
還要求輸入用戶名和密碼(可能使用TextCallbackHandler()
)。
我試圖與Waffle相處,但沒有使其正常工作。大多數示例和解釋都是服務器端的(我只找到一個結合了服務器端和客戶端的示例,但是我無法將其分開)。
我知道,也有類似的問題(例如this),但我沒有輸入密碼就無法正常工作。
PS:我知道,DialogCallbackHandler
已刪除,我僅將其用于測試目的。
推薦答案
好的,經過幾次嘗試,我找到了解決方案。問題不在于代碼,而在于注冊表。如this頁所述,從Java7開始,您不能本機訪問Windows的票證。要更改此設置,您必須設置額外的注冊表項。為此,請進入注冊表文件夾
HKEY_LOCAL_MACHINESystemCurrentControlSetControlLsaKerberosParameters
并添加密鑰
Value Name: AllowTgtSessionKey
Value Type: REG_DWORD
Value: 0x01
要使此功能完全正常工作,您需要一些其他設置:
jaas配置文件
在JAAS配置文件中,您必須設置JAAS應該使用哪些安全模塊。括號前面的部件命名您的配置。如果您使用GSS庫,則必須將其命名為com.sun.security.jgss.krb5.initiate
。使用LoginContext
時,只需將配置名稱作為第一個參數傳遞即可。我的jaas.conf
外觀如下:
com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache = true;
};
Kerberos配置
您還需要Kerberos模塊的配置。這主要包含域地址,但可以包含附加信息。最小工作示例:
[realms]
YOUR.REALM.COM = {
kdc = your.realm.com:88
default_domain = REALM.COM
}
請注意,這是區分大小寫的!
系統屬性
最后,您必須設置Java才能找到該文件。您可以通過在啟動時提供屬性或通過調用System.setProperty()
:
來執行此操作
System.setProperty("java.security.krb5.conf", "src/resources/krb5.conf");
System.setProperty("java.security.auth.login.config", "src/resources/jaas.conf");
這篇關于使用Java客戶端進行單點登錄的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,