Запрос с использованием objectGUID - Spring LDAP Template

Я пытаюсь получить, сохранить и в свою очередь использовать objectGUID для запроса Active Directory. Чтобы получить пользовательские атрибуты, я использую следующие

public static class MyDnKeyValueAttMapper implements AttributesMapper<Object> {
        @Override
        public List<LdapKeyValueList> mapFromAttributes(Attributes attributes)
                throws NamingException, javax.naming.NamingException {
            List<LdapKeyValueList> attributeKeyValMap = new ArrayList<LdapKeyValueList>();
            NamingEnumeration<String> namingEnumeration = attributes.getIDs();

            while (namingEnumeration.hasMoreElements()) {
                String attributeName = (String) namingEnumeration.nextElement();
                String AttributeValue = attributes.get(attributeName).get().toString();
                attributeKeyValMap.add(new LdapKeyValueList(attributeName, AttributeValue));
            }
            return attributeKeyValMap;
        }
    }

Кажется, что objectGuid всегда возвращается в строковом формате. Я также пытался -

UUID guid = (UUID) attributes.get("objectGUID").get();

Это выдает ошибку "невозможно преобразовать строку в uuid"

Похоже, прежде чем я могу сделать что-нибудь ldaptemplate поиска всегда возвращать атрибуты в строковом формате.

Как я могу получить "objectGUID" в его формате, чтобы я мог сохранить его и использовать в поисковых запросах ldapTemplate.

Заранее спасибо.

2 ответа

Решение

Если вы не хотите, чтобы двоичный атрибут (objectGUID имел синтаксис Octet String) был извлечен как строка, вы должны сказать это. С Spring вам придется добавить <entry key="java.naming.ldap.attributes.binary" value="objectGUID"/> в вашей контекстной среде.

Позже byte[] guid = (byte[]) namingEnumeration.getAttributes().get("objectGUID").get(); должен вернуть то, что вы ищете.

Просто набрано, не проверено.

Для Spring вставьте в файл ldapTemplate "java.naming.ldap.attributes.binary"

@Bean
public LdapTemplate ldapTemplate() {
  return new LdapTemplate(contextSource());
}

@Bean
public ContextSource contextSource() {
  final LdapContextSource contextSource = new LdapContextSource();
  contextSource.setUrl(env.getRequiredProperty("ldap.url"));
  contextSource.setBase(env.getRequiredProperty("ldap.base"));
  contextSource.setUserDn(env.getRequiredProperty("ldap.user"));
  contextSource.setPassword(env.getRequiredProperty("ldap.password"));

  // Important!!! Tell ldapTemplate to retrieve AD field
  // "objectGUID" as binary. Otherwise it will be
  // retrieved as a String, thus, modifying the byte[] array
  final Map<String, Object> envProps = new HashMap<>();
  envProps.put("java.naming.ldap.attributes.binary","objectGUID");
  contextSource.setBaseEnvironmentProperties(envProps);

  return contextSource;
}

...

// Will not complain about the String to byte[] conversion and
// Has to be 16 in length. If not, you did something 
// wrong. For example ldapTemplate still retrieves objectGUID
// as String, modifying the value
byte[] guidBytes = (byte[]) attributes.get("objectGUID").get();
if (guidBytes.length == 16) {
  // Convert encoded AD objectGUID to UUID
  // objectGUID is not storing bits sequentially, so do the dance
  UUID uuid = UUID.fromString(
    String.format("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", 
    guidBytes[3] & 255, 
    guidBytes[2] & 255, 
    guidBytes[1] & 255, 
    guidBytes[0] & 255, 
    guidBytes[5] & 255, 
    guidBytes[4] & 255, 
    guidBytes[7] & 255, 
    guidBytes[6] & 255, 
    guidBytes[8] & 255, 
    guidBytes[9] & 255, 
    guidBytes[10] & 255, 
    guidBytes[11] & 255, 
    guidBytes[12] & 255, 
    guidBytes[13] & 255, 
    guidBytes[14] & 255, 
    guidBytes[15] & 255));
}
Другие вопросы по тегам