Single Sign-On with Java Client(使用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客户端进行单点登录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用Java客户端进行单点登录
基础教程推荐
- 如何在 Spring @Value 注解中正确指定默认值? 2022-01-01
- 验证是否调用了所有 getter 方法 2022-01-01
- Java Swing计时器未清除 2022-01-01
- 不推荐使用 Api 注释的描述 2022-01-01
- 从 python 访问 JVM 2022-01-01
- 多个组件的复杂布局 2022-01-01
- Java 实例变量在两个语句中声明和初始化 2022-01-01
- 大摇大摆的枚举 2022-01-01
- 在 Java 中创建日期的正确方法是什么? 2022-01-01
- 如何在 JFrame 中覆盖 windowsClosing 事件 2022-01-01
