Как получить полный DN пользователя в репозиториях Spring Data LDAP - PullRequest
0 голосов
/ 17 февраля 2020

Я создаю расширение для приложения управления пользователями, которое поддерживает пользователей на сервере OpenLDAP для аутентификации (в дополнение к внутренней базе данных) с использованием репозиториев Spring Data Ldap, поскольку приложение уже использует репозитории Spring 5 и Spring Data.

Базовые c репозитории пользователей и групп работают для поиска, создания и обновления, за одним исключением: членство в группе, поскольку для атрибута member требуется полное DN (различающееся имя) и, к сожалению, ключ @Id репозитория пользователя является относительным DN.

My Ldap base is              "dc=example,dc=com"
The UserRepository returns   "cn=user1,ou=users"
but I need the full DN:      "cn=user1,ou=users,dc=example,dc=com"

Базовое имя загружается в ContextSource из ApplicationConfig. java, но так как репозитории генерируются динамически, и я определил только интерфейс, Я не знаю, как внедрить это или свойство и написать код, используя его.

Я не нашел ни одного метода, который возвращает полное DN. Я нашел что-то вроде решения через этот вопрос и пример администратора пользователя из Spring LDAP. Однако это включает в себя возврат к Spring LDAP LdapTemplate, который является шагом назад от репозиториев Spring Data LDAP к более общей c модели запросов. Кроме того, я не могу заставить пример создать или запустить сам по себе из-за конфликтов зависимостей, поэтому я беспокоюсь о долговечности решения, которое смешивает Spring Data LDAP и Spring Ldap Templates.

Мне нужен любой способ получить полное DN или базовое имя изнутри User, Group или их классов репозитория, чтобы я мог предоставить их при добавлении членов в группу или при поиске группы для члена.

1 Ответ

0 голосов
/ 18 февраля 2020

После некоторых испытаний и множества ошибок я нашел прилично чистый способ получения базового пути Ldap, внедряя ContextSource, как определено в ApplicationConfig также в классе Service. Для всех, кто ищет это:

ApplicationConfig. java

@Configuration
@PropertySource("classpath:ldap.properties")

...

@Value("${ldap.url}") String ldapUrl;
@Value("${ldap.base}") String ldapBase;
@Value("${ldap.user}") String ldapUser;
@Value("${ldap.password}") String ldapPassword;

@Bean
public LdapContextSource contextSource() {
    LdapContextSource contextSource = new LdapContextSource();
    contextSource.setUrl(ldapUrl);
    contextSource.setBase(ldapBase);
    contextSource.setUserDn(ldapUser);
    contextSource.setPassword(ldapPassword);
    return contextSource;
}

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

MyServiceImpl. java

@Repository
@Transactional
public class MyServiceImpl implements MyService {

    @Autowired
    private LdapUserRepository userRepository;

    @Autowired
    private LdapGroupRepository groupRepository;

    @Autowired
    LdapContextSource contextSource;

    ...

    @Override
    public Collection<LdapGroup> findGroupByMember(Name name) {
        LdapName dName = LdapUtils.prepend(LdapUtils.removeFirst(name,
            contextSource.getBaseLdapName()), contextSource.getBaseLdapName());

        return groupRepository.findByMember(dName);
    }
}

С помощью методов LdapUtils для удаления и добавив базовый путь, я могу очистить любое входящее имя до полного DN. Это делает LdapGroupRepository простым, с только интерфейсным классом, а остальное выполняется Spring Data LDAP:

LdapGroupRepository. java

public interface LdapGroupRepository extends LdapRepository<LdapGroup> {

    Optional<LdapGroup> findByName(String groupName);

    @Query("(member={0})")
    Collection<LdapGroup> findByMember(Name member);
}
...