我是LDAP新手,正在使用com.sun.jndi.ldap
jar。
我有一个登录页面,用户输入的用户名和密码。我的工作是使用位于LDAP中的数据验证凭据。
直到现在我已连接到LDAP服务器,经过身份验证并检索了uid。
现在我要比较用户输入的密码和LDAP中的密码(密码是私有的,即查询用户ID时无法查看)。
有没有办法比较这两个密码?
答案 0 :(得分:2)
我们有几个样本使用绑定作为用户。你应该提到别人,做一个绑定,从不比较密码。密码的比较是一种不好的做法,不应该使用,因为在密码属性上执行比较请求时,可能会绕过一些内置的LDAP服务器实现功能,如密码过期和入侵检测。
答案 1 :(得分:1)
Java LDAP API提供search
操作,从而导致LDAP比较。这是an example of the same。
答案 2 :(得分:0)
如果在您的应用程序中有一个使用Spring Security的选项,那么它有一个模块,允许您将身份验证与LDAP集成。
答案 3 :(得分:0)
你问的是错误的问题。使用LDAP的正确方法是使用用户的凭据而不是您自己的凭据“绑定”到目录。在JNDI中,这对应于LdapContext.reconnect()
操作,在将用户凭据设置为上下文环境Context.SECURITY_PRINCIPAL
和Context.SECURITY_CREDENTIALS.
之后,这会导致LDAP服务器根据需要进行密码比较。
答案 4 :(得分:0)
如果您确实想要比较某个字段(不限于用户名和密码),则可以使用以下包装而不是search
方法:
public boolean compare(LdapContext ctx, String dn, String filter) {
NamingEnumeration<SearchResult> answer = null;
try {
SearchControls searchCtls = new SearchControls();
searchCtls.setSearchScope(SearchControls.OBJECT_SCOPE);
searchCtls.setReturningAttributes(new String[0]);
answer = ctx.search(dn, filter, searchCtls);
if (answer == null || !answer.hasMore()) {
return false; // E.g.: wrong filter
}
} catch (NamingException ex) {
return false; // E.g.: wrong DN
}
return true;
}
ctx
可以是:
LdapContext ctx = new InitialLdapContext(getEnvironment(userName, password), null);
并且getEnvironment
方法可以是:
private Hashtable<String, Object> getEnvironment(String userName, String password) {
Hashtable<String, Object> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, LDAP_HOST_389);
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
env.put(Context.SECURITY_PRINCIPAL, userName);
env.put(Context.SECURITY_CREDENTIALS, password);
return env;
}
如果您拨打上面的compare
方法,您将获得:
false
如果出现问题(例如:无效dn
,无效filter
) true
否则。在这种情况下,如果您检查answer
方法中的compare
,您会看到:
SearchResult sr = answer.next();
sr.getName(); // this is empty
sr.getAttributes(); // No attributes
答案 5 :(得分:-1)
如果我理解正确,您试图比较用户输入的密码和Java代码中LDAP的密码。这在JAVA中是不可能的,因为java没有从LDAP检索密码的选项。我们只能要求LDAP验证用户输入的详细信息。超过LDAP中的密码不会以纯文本形式存储,它将被加密和存储。