Pour une application Spring Boot, j'ai correctement configuré une variable Printemps LdapTemplate
à l'aide de annotations, y compris la dépendance LdapContextSource
avec @Value
s à 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;
}
}
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.).
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.