我需要在身份验证后从LDAP中检索各种值,如描述、办公室等。
我已经能够完成身份验证,但无法检索其他值。
我应该使用什么名称来检索完整的数据??
请帮助。
我的代码如下:
public boolean authenticate(String userid, String pass, String domain) {
boolean retval = false;
String searchFilter ="(&(objectClass=user)(" + LDAP_UID_ATTR + "=" + userid + "))";
try {
System.out.println("Start: getLDAPAttrs");
NamingEnumeration answer =
getLDAPAttrs(userid, pass, searchFilter, domain);
String uid = "";
while (answer.hasMoreElements()) {
SearchResult sr = (SearchResult)answer.next();
Attributes attrs = sr.getAttributes();
try {
uid = attrs.get(LDAP_UID_ATTR).toString();
System.out.println("uid: " + uid);
System.out.println(attrs.get("mail"));
uid = uid.substring(uid.indexOf(':') + 2);
} catch (Exception err) {
// uid = "";
System.out.println(err.getMessage());
err.printStackTrace();
}
// verify userid
if (userid.equalsIgnoreCase(uid)) {
retval = true;
break;
}
}
} catch (NamingException ne) {
System.out.println("In authenticateWithLDAP, LDAP Authentication NamingException : " +
ne.getMessage());
} catch (Exception ex) {
System.out.println("In authenticateWithLDAP, LDAP Authentication Exception : " +
ex.getMessage());
}
return retval;
// return retval;
}
private NamingEnumeration getLDAPAttrs(String userid, String pass,
String searchFilter,
String domain) throws NamingException,
Exception {
String host = getServerName();
String port = getIP_Port();
String dcPart1 = getDcPart1();
String dcPart2 = getDcPart2();
// String attrUserID = getLDAP_UID_ATTR();
// String attrUserName = getLDAP_UNAME_ATTR();
// set attribute names to obtain value of
String[] returnedAtts = { "sAMAccountName", "cn","mail" };
SearchControls searchCtls = new SearchControls();
searchCtls.setReturningAttributes(returnedAtts);
// specify the search scope
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// set search base
String searchBase = "DC=" + dcPart1 + ",DC=" + dcPart2;
// set ldap env values
Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
environment.put(Context.PROVIDER_URL, "ldap://" + host + ":" + port);
environment.put(Context.SECURITY_AUTHENTICATION, "simple");
environment.put(Context.SECURITY_PRINCIPAL, userid + "@" + domain);
environment.put(Context.SECURITY_CREDENTIALS, pass);
// set ldap context
DirContext ctxGC = new InitialDirContext(environment);
// perform search to obtain values
NamingEnumeration answer =
ctxGC.search(searchBase, searchFilter, searchCtls);
return answer;
}
我发现了问题所在。
我必须在返回的属性中包含参数:
String[] returnedAtts = { "sAMAccountName", "cn","mail" };
或
String[] returnedAtts = { "sAMAccountName", "cn","mail","description" };
然后在获取属性时使用其值。
谢谢
LDAP客户端通过向服务器发送搜索请求,然后读取服务器的响应来检索属性值(在问题中称为“字段”)。搜索请求至少由以下组成:
base
、one
或子树
此外,请求的属性列表可以与搜索请求一起传输。如果没有提供请求的属性列表,许多LDAP SDK将简单地返回所有用户属性,而不返回操作属性。在这种情况下,请求属性描述
和office
以及任何其他必需的属性。
LDAP兼容服务器强制执行访问控制方案,这可能会导致服务器不返回某些属性。咨询LDAP管理员,以确定LDAP客户端连接的身份验证状态是否具有访问所需属性的权限。
ldapsearch
命令行工具,但概念与编程访问相同。我有一个用例,我需要找到客户的分页列表,其中客户看起来像这样: 然后我有了我的存储库界面 我的界面扩展了分页和排序存储库以提供可分页的结果。 我还有一个输入框,用户可以在其中放置任何字符串。现在我想给他一个结果页面,其中包含其中一个字段(任何客户字段)中的输入字符串。 我不想使用命名查询。有没有一种聪明的方法,我可以通过分页和排序存储库来实现这一点,或者我是否需要使用规范接口并实现分页?
//错误
问题内容: 我正在玩LDAP和Java搜索。这是我的一个简单组织的LDIF导出 如何运行Java代码段以从LDAP服务器获取所有用户?我的Apache DS目录服务器上没有身份验证设置。 问题答案:
如何使LDAP查询只返回所有级别中具有ou=groups的组? http://confluence.atlassian.com/display/dev/how+to+write+ldap+search+filters
示例文档 索引定义 内部无源过滤的响应良好。 响应包含嵌套属性的所有属性。即开始时间、结束时间和文本行。如何在响应中仅返回endtime和startTime? 查询失败 错误HTTP/1.1 400错误请求内容类型:application/json;字符集=UTF-8内容长度:265 {"错误":{"root_cause":[{"type":"illegal_argument_exception"
我想根据数字字段对搜索结果进行排序。在下面的示例代码中,我希望基于'Age'字段进行排序。我从以下答案开始: [如何在Lucene 6中对IntPont或LongPoint字段进行排序 [在Lucene中根据数字字段对搜索结果进行排序 我在搜索函数中将sortfield.type.score更改为sortfield.type.long。但我得到: 意外的docvalues为字段“年龄”键入NONE