web-dev-qa-db-fra.com

La meilleure pratique pour configurer Spring LdapTemplate via des annotations au lieu de XML?

Pour une application Spring Boot, j'ai correctement configuré une variable Printemps LdapTemplate à l'aide de annotations, y compris la dépendance LdapContextSource avec @Values à partir de application.properties. (Woot! Je n'ai pas trouvé d'exemple, alors peut-être que cela aidera les autres.)

Les extraits (ci-dessous) configurent la source de contexte, l'injectent dans une variable LdapTemplate et la transfèrent automatiquement dans mon DirectoryService.

Y a-t-il un moyen meilleur/plus propre de configurer la ContextSource dans une application Spring Boot?

application.properties (sur le chemin de classe):

ldap.url=ldap://server.domain.com:389
ldap.base:OU=Employees,OU=Users,DC=domain,DC=com
ldap.username:CN=myuserid,OU=employees,OU=Users,DC=domain,DC=com
ldap.password:secretthingy

MyLdapContextSource.Java: 

@Component
public class MyLdapContextSource extends LdapContextSource implements ContextSource {

    @Value("${ldap.url}")
    @Override
    public void setUrl(String url) { super.setUrl(url);  }

    @Value("${ldap.base}")
    @Override
    public void setBase(String base) {super.setBase(base); }

    @Value("${ldap.username}")
    @Override
    public void setUserDn(String userDn) {super.setUserDn(userDn); }

    @Value("${ldap.password}")
    @Override
    public void setPassword(String password) { super.setPassword(password); }
}

MyLdapTemplate.Java:

@Component
public class MyLdapTemplate extends LdapTemplate {

    @Autowired
    public MyLdapTemplate(ContextSource contextSource) { super(contextSource); }
}

DirectoryService.Java:

@Service
public class DirectoryService {

    private final LdapTemplate ldapTemplate;

    @Value("${ldap.base}")
    private String BASE_DN;

    @Autowired
    public DirectoryService(LdapTemplate ldapTemplate) { this.ldapTemplate = ldapTemplate; }

    public Person lookupPerson(String username) {
        return (Person) ldapTemplate.lookup("cn=" + username, new PersonAttributesMapper());
    }

    public List<Person> searchDirectory(String searchterm) {
        SearchControls searchControls = new SearchControls();
        searchControls.setCountLimit(25);
        searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

        List<Person> people = (List<Person>) ldapTemplate.search(
                BASE_DN, "cn=" + searchterm, searchControls, new PersonAttributesMapper());
        return people;
    }
}
26
Tim

Pourquoi toutes les sous-classes? Il suffit d’utiliser la configuration pour configurer les beans. XML ou Java Config.

@Configuration
public class LdapConfiguration {

    @Autowired
    Environment env;

    @Bean
    public LdapContextSource contextSource () {
        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"));
        return contextSource;
    }

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

}

Votre DirectoryService peut rester le même car il aura le LdapTemplate autowired. 

Une règle générale est que vous ne voulez pas étendre vos beans d'infrastructure (comme DataSource ou LdapTemplate) mais les configurer explicitement. Ceci par opposition à vos beans d’application (services, référentiels, etc.).

42
M. Deinum

Le câblage explicite de votre LDAP n'est pas du tout nécessaire pour les cas simples. C’est le genre de chose que Spring Boot cherche à éliminer en se faisant d’abord une opinion.

Assurez-vous que la dépendance spring-boot-starter-data-ldap ou spring-ldap-core est incluse, par exemple. pour Maven dans votre pom:xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>

Configurez votre LDAP dans application.properties avec les clés suivantes:

# Note the spring prefix for each and use just the CN for username
spring.ldap.url=ldap://server.domain.com:389
spring.ldap.base=OU=Employees,OU=Users,DC=domain,DC=com
spring.ldap.username=myuserid
spring.ldap.password=secretthingy

Ensuite, faites simplement confiance à Spring pour le câblage automatique, par exemple. utilisant l'injection de champ1:

@Autowired
private final LdapTemplate ldapTemplate;

Référence: Guide de référence Spring Boot: LDAP


1 L'injection sur le terrain est généralement non recommandée mais elle est utilisée ici pour la concision.

1
xlm