通过注释而不是XML配置Spring LdapTemplate的最佳实践?

2022-09-01 06:39:21

对于Spring Boot应用程序,我使用注释成功配置了Spring,包括与s from application.properties的依赖关系。(呜呜!我找不到例子,所以也许这会帮助其他人。LdapTemplateLdapContextSource@Value

代码段(如下)设置上下文源,将其注入到 中,然后将其自动连接到我的 DirectoryService 中。LdapTemplate

有没有更好/更简洁的方法在Spring Boot应用程序中设置上下文源

application.properties(在类路径上):

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); }
}

目录服务.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;
    }
}

答案 1

为什么是所有子类?只需使用配置来配置 Bean。XML 或 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());        
    }

}

您可以保持原样,因为它将具有自动连接。DirectoryServiceLdapTemplate

一般的经验法则是,您不希望扩展基础结构 Bean(如 或 ),而是显式配置它们。这与您的应用程序Bean(服务,存储库等)相反。DataSourceLdapTemplate


答案 2

对于直接的情况,LDAP的显式连接根本不是必需的。这是Spring Boot旨在通过首先固执己见来消除的那种事情。

确保包含 或 依赖项,例如::spring-boot-starter-data-ldapspring-ldap-corepom:xml

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

使用以下键配置您的 LDAP:application.properties

# 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

然后只需依靠Spring自动布线,例如使用现场注入1

@Autowired
private final LdapTemplate ldapTemplate;

参考:弹簧靴参考指南:LDAP


1 通常不建议进行现场注射,但此处用于简洁。


推荐