que example configuracion code bean anotaciones anotacion java spring-boot annotations spring-ldap

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.