Squeak.ru - шаблоны программирования

SpEL не поддерживается в аннотации Spring @Entry.base

Я использую Spring Data LDAP, а Spring Boot предоставляет встроенную поддержку встроенного сервера UnboundID. Однако, когда я использую аннотацию Spring Data LDAP @Entry, мне нужно указать другой base в аннотации в зависимости от того, использую ли я встроенный сервер UnboundID LDAP или удаленный сервер Active Directory.

Я пытался сделать это с помощью SpEL и свойств на основе профиля, указав:

@Entry(base = "${ldap.person.base}", ...)

Затем у меня есть application.propreties с ldap.person.base=OU=AD Person Base и application-embedded.properties с ldap.person.base=OU=Embedded Person Base.

Однако аннотация @Entry, похоже, не поддерживает оценку SpEL:

javax.naming.InvalidNameException: Недопустимое имя: ${ldap.person.base}

В Spring LDAP есть открытая проблема, чтобы добавить поддержку этого, но есть ли обходной путь или какой-либо другой способ сделать это, пока он не будет поддерживаться в Spring LDAP?



Ответы:


1

Я не уверен, что следую здесь, но если вы используете автоматическую настройку LDAP в Spring Boot, недостаточно ли установить для свойства spring.ldap.base одно или другое (OU=AD Person Base или OU=Embedded Person Base) в зависимости от профиля, который вы используешь?

И EmbeddedLdapAutoConfiguration, и LdapAutoConfiguration используют объект LdapProperties для установки различных атрибутов LdapContextSource во время создания bean-компонента, включая его base. Насколько я могу судить, вам не нужно определять его для каждого @Entry в вашей кодовой базе, если установлено LdapContextSource.base.

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

08.05.2017
  • Когда я делаю это, это работает во встроенной версии, но я получаю javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name '/', когда приложение выполняет поиск LDAP в Active Directory. Если я укажу base="OU=Domain Users" в своей записи Person, это сработает, но тогда это сломает встроенную версию. 09.05.2017

  • 2

    Оказывается, причина, по которой мне понадобился другой base, в первую очередь заключается в том, что Spring не устанавливал base на ContextSource.

    Когда вы разрешаете Spring Boot автоматически настраивать встроенный сервер LDAP, он создает ContextSource как таковой в EmbeddedLdapAutoConfiguration:

    @Bean
    @DependsOn("directoryServer")
    @ConditionalOnMissingBean
    public ContextSource ldapContextSource() {
        LdapContextSource source = new LdapContextSource();
        if (hasCredentials(this.embeddedProperties.getCredential())) {
            source.setUserDn(this.embeddedProperties.getCredential().getUsername());
            source.setPassword(this.embeddedProperties.getCredential().getPassword());
        }
        source.setUrls(this.properties.determineUrls(this.environment));
        return source;
    }
    

    Как видите, нигде он не вызывает source.setBase(). Итак, чтобы решить эту проблему, я добавил файл конфигурации с @Profile("embedded") и вручную создал ContextSource, где я сам установил base (я опускаю часть учетных данных, потому что я не использую учетные данные для встроенного сервера):

    @Configuration
    @Profile("embedded")
    @EnableConfigurationProperties({ LdapProperties.class })
    public class EmbeddedLdapConfig {
    
        private final Environment environment;
        private final LdapProperties properties;
    
        public EmbeddedLdapConfig(final Environment environment, final LdapProperties properties) {
            this.environment = environment;
            this.properties = properties;
        }
    
        @Bean
        @DependsOn("directoryServer")
        public ContextSource ldapContextSource() {
            final LdapContextSource source = new LdapContextSource();
            source.setUrls(this.properties.determineUrls(this.environment));
            source.setBase(this.properties.getBase());
            return source;
        }
    }
    

    Теперь я могу оставить значение атрибута base в моем @Entry одинаковым как для сервера Active Directory, так и для встроенного сервера UnboundID, и все будет работать правильно.

    09.05.2017
  • Хорошая работа! Пожалуйста, подумайте над тем, чтобы проголосовать за мой ответ, поскольку вы, очевидно, использовали метод, который я предложил, чтобы исправить это. 09.05.2017
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...