java - example - ¿Mejores prácticas para configurar Spring LdapTemplate a través de anotaciones en lugar de XML?
spring ldap example (2)
Para una aplicación Spring Boot, configuré exitosamente una Spring LdapTemplate
usando anotaciones , incluida la dependencia @Value
con @Value
s de application.properties. (¡Woot! No pude encontrar un ejemplo, así que quizás esto ayude a otros).
Los fragmentos (a continuación) configuran el origen del contexto, lo inyectan en una LdapTemplate
y lo conectan automáticamente a mi DirectoryService.
¿Existe una forma mejor / más limpia de configurar ContextSource
en una aplicación Spring Boot?
application.properties (en el classpath):
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;
}
}
¿Por qué todas las subclases? Solo usa la configuración para configurar los beans. Ya sea XML o 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());
}
}
Su DirectoryService
puede seguir siendo el mismo ya que tendrá la LdapTemplate
autowired.
Una regla general es que no desea extender sus beans de infraestructura (como DataSource
o LdapTemplate
) sino configurarlos explícitamente. Esto a diferencia de los beans de aplicación (servicios, repositorios, etc.).
El cableado explícito de su LDAP no es necesario en absoluto para casos directos. Este es el tipo de cosas que Spring Boot pretende eliminar al ser considerado en primer lugar.
Asegúrese de tener incluido el spring-ldap-core
spring-boot-starter-data-ldap
o la dependencia del spring-ldap-core
, por ejemplo, para Maven en su pom:xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
Configure su LDAP en application.properties
con las siguientes teclas:
# 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
Luego, simplemente confíe en Spring para autowire, por ejemplo, utilizando inyección de campo 1 :
@Autowired
private final LdapTemplate ldapTemplate;
Referencia: Spring Boot Guía de referencia: LDAP
1 La inyección de campo generalmente no se recomienda pero se usa aquí para concisión.