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的主要内容,如果未能解决你的问题,请参考以下文章