java - 查询 LDAP 结构未知的 LDAP 服务器

标签 java spring ldap apacheds ldif

我正在为我的公司使用 Spring 进行 Java 开发。我们正在开发一个拥有本地 LDAP 服务器的应用程序。 LDAP 服务器将用于获取信息。但是,我们不希望应用程序的用户知道 LDAP 结构/模式。这是因为客户/用户将拥有自己的 LDAP 服务器以及自己的 LDAP 结构/架构。

例如,客户/用户将通过提供用于连接 LDAP 服务器的 LDAP 服务器详细信息,通过用户界面获取信息。连接后,他们将能够通过执行查询来获取信息。现在,他们将不知道有关 LDAP 结构的信息。将要编写的代码将通过执行用户查询来完成。如果运行查询,那么它将返回该信息,否则将给出异常。

我面临的问题是:

当你使用 Spring LDAP 时,有一个叫做 AttributesMapper 和 ContextMapper 的东西。为了使用它,我必须传入一个强类型对象。例如:

public class EmployeeAttributesMapper implements AttributesMapper {

public EmployeeAttributesMapper() {

}

/**
 * This method maps the Employee Entity to data stored in the LDAP Server through a Attribute.
 * @param attrs the name of the Attribute to get
 * @return the Employee Entity.
 */
public Object mapFromAttributes(Attributes attrs) throws NamingException {
    Employee employee = new Employee();
    employee.setFirstName((String) attrs.get("cn").get());
    return employee;
}
}

上面的代码根据查询执行时,将仅获取有关 cn 属性的信息,而不会获取其他信息。还有其他不需要强类型对象的东西吗?

我不知道该怎么办。

例如,要搜索所有员工:

public List getAllEmployees() {
    return ldapTemplate.search("", "(objectclass=person)", new EmployeeContextMapper());
}

这将返回所有员工,但仅设置 cn 属性。但是,在客户 LDAP 服务器上,它们可能没有名为 cn 的属性。

执行此操作的最佳方法是什么?我们编写的代码充当用户界面和客户 LDAP 服务器之间的代理。

最佳答案

最简单的答案是将属性的预期用途抽象为属性类型,即 OID 或别名。例如,将“Name”映射到 cn(常用名)属性别名,将“First Name”映射到 givenName 属性,将“Last Name”映射到 sn 属性,等等。 IETF 有许多 RFC,它们描述了建议与 LDAP 目录服务器数据库一起使用的属性。 inetOrgPerson (RFC2798)就是一个很好的例子。

如果表示与实现正确分离,用户根本不需要知道数据来自 LDAP 目录服务器,更不用说属性名称是什么。

关于java - 查询 LDAP 结构未知的 LDAP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13452102/

相关文章:

java - 原始列表和通用列表

java - 如何解析表达式来访问 POJO 属性?

java - 在 jar 里找不到我的主类

mysql - 如何在 Spring 中使用变量作为 @Query 的值

linux - 如何根据 ldap/MS AD 对 redhat 用户进行身份验证

regex - 使用正则表达式的LDAP搜索

java - 杀死刚刚运行的Linux进程

java - CacheResolver 和 KeyGenerator 之间有什么区别以及何时使用它们

java - Spring Security + 容器管理的身份验证问题

c# - 使用 NetBios 名称的受信任域的 PrincipalContext.ValidateCredentials 速度慢