如何使用用户名和密码从LDAP目录验证用户?

时间:2012-08-27 17:24:59

标签: java ldap spring-ldap

我是LDAP API的新手。我能够连接到LDAP服务器并搜索用户。如何使用LDAP API对用户/密码进行身份验证?我在DirContext上看不到任何验证方法 要验证用户我是否必须:

  1. 将用户密码作为SECURITY_CREDENTIALS
  2. 传递
  3. 建立LDAP连接
  4. 搜索指定的用户名
  5. 这是否意味着LDAP中的身份验证?

2 个答案:

答案 0 :(得分:3)

当客户端连接到LDAP目录服务器时,连接授权状态将设置为anonymous。 LDAP客户端使用BIND请求来更改连接的授权状态。每个BIND请求都将连接授权状态更改为anonymous,并且每个成功的BIND请求都将连接的授权状态更改为与成功BIND请求关联的授权状态,即用户的授权状态。失败的BIND请求使连接处于anonymous状态。

客户端构造BindRequest(简单的BIND请求或SASL绑定请求的形式)传输到LDAP目录服务器并解释来自服务器的响应,包括可能伴随BIND响应的任何响应控件。 BIND响应中的结果代码为零表示LDAP目录服务器与凭据匹配,并且用户已通过身份验证。

如果已知用户的专有名称,则可以从专有名称构造BIND请求。如果不知道,LDAP客户端必须构造搜索请求,将其传输到服务器并解释响应。专有名称始终包含在成功的搜索响应中,该响应至少返回一个条目。然后使用搜索响应中返回的distinguished来构造上面的BIND请求。

在最简单的情况下:

// exception handling is not shown
final String dn = ....;
final byte[] password = ....;
final BindRequest bindRequest = new SimpleBindRequest(dn,password);
final LDAPConnection ldapConnection = new LDAPConnection(hostname,port);
final BindResult bindResult = ldapConnection.bind(bindRequest);
final ResultCode resultCode = bindResult.getResultCode();
if(resultCode.equals(ResultCode.SUCCESS))
{
    // user is authenticated
}
ldapConnection.close();

如果您使用的是Java,则应使用UnboundID LDAP SDK(JNDI不应用于新代码)。

另见

答案 1 :(得分:2)

您可以尝试JAAS。 JDK中有com.sun.security.auth.module.LdapLoginModule用于此目的。我试过了,效果很好。