Java-Spring-LDAP-Kerberos
Posted
技术标签:
【中文标题】Java-Spring-LDAP-Kerberos【英文标题】: 【发布时间】:2018-03-21 01:45:48 【问题描述】:我需要一些帮助,将我基于 spring 的应用程序中的用户身份验证委托给 Active Directory,这似乎将这个责任委托给了 Kerberos - 我似乎无法弄清楚如何做到这一点。以下是更多混乱的真实情况:
我按照 Spring 指南配置 Spring Security 以使用 LDAP 服务器。一切顺利。
我得到了我的实际 LDAP 服务器的主机和端口。我将 Spring Security 配置为与之对话,它不允许我进行身份验证。
好的,我下载了 jxplorer 并成功连接到我的 LDAP 服务器。如果 jxplorer 可以连接到只知道 HOST、PORT、USERNAME 和 PASSWORD 的 LDAP,我认为我的应用程序应该能够做到这一点。
奇怪的是,我的 LDAP 没有显示 OU=people。我的员工分散在树中各个 OU 的更深处,每个部门都有一个 OU - 但是,大多数人在树中的深度都一样。
另外奇怪的是,我唯一标识一个人的实际人员节点没有 userPassword 属性。
为了实验,我配置 Spring Security 的方式是通过查看代表我部门的 OU 并告诉它用作密码 mailNickname(使用 PlaintTextPasswordEncoder())来尝试对个人进行身份验证(使用 PlaintTextPasswordEncoder())并且它工作正常 - 仅在 3268 端口上,而不是在 389 上。
此时我开始推测 - LDAP,正在告诉我的基于 spring 的应用程序它需要与 Kerberos 通信,而我没有告诉它如何做到这一点,这就解释了为什么我的应用程序无法进行身份验证。但是,没有人告诉 jxplorer Kerberos 将对其进行身份验证,但它设法获得了 LDAP 树的视图。显然,我的 spring-app 的假设!= jxplorer 的假设。我给他们完全相同的信息,但一个人设法验证另一个人没有。有人知道吗?
编辑: 好的,所以,我仍然没有解决这个问题,但我的错误已经改变,我想这是进步的标志。
我是这样配置spring的:link
现在,当我尝试登录时,如果我输入了错误的密码或用户名,我会收到明确指出密码错误的投诉。但是,如果我输入正确的密码,则投诉会有所不同。
堆栈跟踪的结尾包括: 原因:javax.security.auth.login.LoginException: Pre-authentication information was invalid (24)
但是,调试还表明在 kerberos 数据库中找到了用户,因为它说:“principal is username@correct_realm”和“Added server's keyKerberos Principal correct_user@correct_realm”并进行了一些十六进制转储。
因此,我确信我的 keytab 没有完成它的工作。我确定 Spring 找到了我的键选项卡,因为它说:KeyTab is my_keytab_file(否则它会说:KeyTab is null)。
【问题讨论】:
【参考方案1】:如果配置了 Kerberos,您可以尝试 SPNEGO。它是 Java 中用于 Kerberos 的最佳库之一。
阅读:http://spnego.sourceforge.net/
Kerberos 身份验证示例代码:
使用示例(用户名/密码):
public static void main(final String[] args) throws Exception
System.setProperty("java.security.krb5.conf", "krb5.conf");
System.setProperty("sun.security.krb5.debug", "true");
System.setProperty("java.security.auth.login.config", "login.conf");
SpnegoHttpURLConnection spnego = null;
try
spnego = new SpnegoHttpURLConnection("spnego-client", "dfelix", "myp@s5");
spnego.connect(new URL("http://medusa:8080/index.jsp"));
System.out.println(spnego.getResponseCode());
finally
if (null != spnego)
spnego.disconnect();
【讨论】:
以上是关于Java-Spring-LDAP-Kerberos的主要内容,如果未能解决你的问题,请参考以下文章