web-dev-qa-db-ja.com

XMLの代わりに注釈を介してSpring LdapTemplateを構成するためのベストプラクティス?

Spring Bootアプリケーションの場合、annotationsを使用してSpring LdapTemplateを正常に構成しました。これにはapplication_propertiesの_@Value_ sでLdapContextSource依存関係が含まれます。 (Woot!例を見つけることができなかったので、他の人に役立つかもしれません。)

スニペット(以下)は、コンテキストソースをセットアップし、LdapTemplateに挿入し、それをDirectoryServiceに自動接続します。

Spring BootアプリでContextSourceを設定するより良い/よりクリーンな方法はありますか?

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

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;
    }
}
_
29
Tim

なぜすべてのサブクラスなのか?構成を使用して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());        
    }

}

DirectoryServiceは、LdapTemplateが自動配線されるため、同じままにすることができます。

一般的な経験則として、インフラストラクチャBean(DataSourceLdapTemplateなど)を拡張するのではなく、明示的に構成することをお勧めします。これは、アプリケーションBean(サービス、リポジトリなど)とは対照的です。

46
M. Deinum

LDAPの明示的な接続は、単純な場合にはまったく必要ありません。これは、Spring Bootがそもそも意見を述べることで排除することを目指しているものです。

spring-boot-starter-data-ldapまたはspring-ldap-core依存関係が含まれていることを確認してください。 pom:xmlのMavenの場合:

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

次のキーを使用してapplication.propertiesでLDAPを構成します。

# 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;

参照: Spring Boot Reference Guide:LDAP


1 通常、フィールド注入は 推奨されません ですが、ここでは簡潔さのために使用されています。

2
xlm