我正在为我的公司使用 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/