我是 LDAP API 的新手。我能够连接到 LDAP 服务器并搜索用户。如何使用 LDAP API 对用户名/密码进行身份验证?我没有看到任何身份验证方法DirContext
。
验证用户是否必须:
- 将用户密码作为 SECURITY_CREDENTIALS 传递
- 建立 LDAP 连接
- 搜索给定的用户名
这是否意味着 LDAP 中的身份验证?
我是 LDAP API 的新手。我能够连接到 LDAP 服务器并搜索用户。如何使用 LDAP API 对用户名/密码进行身份验证?我没有看到任何身份验证方法DirContext
。
验证用户是否必须:
这是否意味着 LDAP 中的身份验证?
当客户端连接到 LDAP 目录服务器时,连接授权状态设置为anonymous
。LDAP 客户端使用 BIND 请求来更改连接的授权状态。每个 BIND 请求将连接授权状态更改为anonymous
,每个成功的 BIND 请求将连接的授权状态更改为与成功的 BIND 请求关联的授权状态,即用户的授权状态。失败的 BIND 请求使连接处于某种anonymous
状态。
客户端构造一个BindRequest
(简单的 BIND 请求或一种形式的 SASL 绑定请求)传输到 LDAP 目录服务器并解释来自服务器的响应,包括可能伴随 BIND 响应的任何响应控制。BIND 响应中的结果代码为零表示 LDAP 目录服务器与凭据匹配并且用户已通过身份验证。
如果用户的专有名称已知,则可以从专有名称构造 BIND 请求。如果不知道,LDAP 客户端必须构造一个搜索请求,将其传输到服务器并解释响应。可分辨名称始终包含在返回至少一个条目的成功搜索响应中。然后使用搜索响应中返回的distinct来构造如上的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 不应用于新代码)。
你可以试试 JAAS。为此,JDK 中有com.sun.security.auth.module.LdapLoginModule 。我试过了,效果很好。