我试图在某些Java代码中验证用户的密码:
private void bindToLdap(String un, String pw) throws NamingException, AuthenticationException {
log.debug ("Doing LDAP bind as user");
Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.PROVIDER_URL, LdapConns.openLdapUrl);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "uid="+un+",ou=people,<base OU>");
env.put(Context.SECURITY_CREDENTIALS, pw);
DirContext dctx = new InitialDirContext(env);
log.debug("Context below:");
log.debug(dctx.getEnvironment().toString());
dctx.lookup("ou=people");
log.debug("connection context:");
log.debug(dctx.getEnvironment().toString());
log.debug ("Bound as user?");
}
到目前为止,我所阅读的所有内容都表明,如果我输入了错误的密码,我应该在实例化DirContext时采取异常。事实并非如此 - 即使输入已知的错误密码,我也会收到有效的DirContext。我期望在dctx.lookup上捕获一个AuthenticationException,实际上我发现了一个NamingException。
在调试日志中,我显示:
[usermgmt.action.ChangeInternalPassword:bindToLdap:242] Context below:
[usermgmt.action.ChangeInternalPassword:bindToLdap:243] {java.naming.provider.url=ldaps://<ldap server>:636/, java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory, java.naming.security.authentication=simple, java.naming.security.principal=nononyen_test, java.naming.factory.url.pkgs=org.apache.naming, java.naming.security.credentials=fubar!}
如何验证密码是否确实正确?我是否需要在绑定后对LDAP数据库执行搜索以获取异常?
LDAP数据库是OpenLDAP。
答案 0 :(得分:3)
要确定身份验证ID和密码是否正确,应用程序必须建立与目录服务器的连接,然后发送绑定请求并检查响应。来自服务器的绑定响应将包含一个整数结果代码,指示绑定请求的成功或失败,还可能包含响应控件以及有关用户条目状态的一些额外信息。