Запрос сервера LDAP, где структура LDAP неизвестна

Я разрабатываю Java, используя Spring для своей компании. Мы разрабатываем приложение, в котором у нас есть локальный сервер 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 клиента.


person user1646481    schedule 19.11.2012    source источник


Ответы (1)


Самый простой ответ — абстрагировать предполагаемое использование атрибутов от типа атрибута, который является OID или псевдонимом. Например, сопоставьте «Имя» с псевдонимом атрибута cn (обычное имя), «Имя» с атрибутом givenName, «Фамилия» с атрибутом sn и так далее. У IETF есть много RFC, описывающих атрибуты, рекомендованные для использования с базами данных сервера каталогов LDAP. Хорошим примером является inetOrgPerson (RFC2798).

Если представление правильно отделено от реализации, пользователям вообще не нужно знать, что данные поступают с сервера каталогов LDAP, не говоря уже об именах атрибутов.

person Terry Gardner    schedule 19.11.2012