2

I try to pool my ldap Connections. For Configuration in Java i found this: Spring LDAP PoolingContextSource via annotation

@Bean
public LdapContextSource ldapContextSource() {

    LdapContextSource contextSource = new LdapContextSource();

    contextSource.setUrl(ldapUrl);
    contextSource.setBase(ldapBase);

    return contextSource;
}


@Bean
public ContextSource contextSource() {

    PoolingContextSource poolingContextSource = new PoolingContextSource();

    poolingContextSource.setDirContextValidator(new DefaultDirContextValidator());
    poolingContextSource.setContextSource(ldapContextSource());
    poolingContextSource.setTestOnBorrow(true);
    poolingContextSource.setTestWhileIdle(true);

    return poolingContextSource;
}


@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.ldapAuthentication()
        .contextSource(contextSource()) //Here is the Problem
        .userDnPatterns(ldapUserDnPatterns)
        .groupSearchBase(ldapGroupSearchBase)
        .groupSearchFilter(ldapGroupSearchFilter)
        .userSearchBase(ldapUserSearchBase);
}

How can i set my PoolingContextSource in the AuthenticationManagerBuilder? It is no applicable type. When i use ldapContextSource() without the PoolingContextSource Bean, it works as long as the connection doesn't timeout :(

Could somebody give me a hint?

Community
  • 1
  • 1
Yannic Bürgmann
  • 6,301
  • 5
  • 43
  • 77

1 Answers1

0

Could not find a good way to solve the interface incompatible issue. This is what I did instead.


    LdapContextSource contextSource = new LdapContextSource();
    contextSource.setUrl(ldapUrl);
    contextSource.setUserDn(managerDn);
    contextSource.setPassword(managerPassword);
    contextSource.afterPropertiesSet();

    PoolConfig poolConfig = new PoolConfig();
    poolConfig.setTestOnBorrow(true);
    poolConfig.setTestWhileIdle(true);
    PooledContextSource pcs = new PooledContextSource(poolConfig);
    pcs.setDirContextValidator(new DefaultDirContextValidator());
    pcs.setContextSource(contextSource);

    auth
        .ldapAuthentication()
        .userDnPatterns(userDnPattern)
        .userSearchFilter(searchFilter)
        .userSearchBase(searchBase)
        .contextSource(new BaseLdapPathContextSource() {
          @Override
          public DirContext getReadOnlyContext() throws NamingException {
            return pcs.getReadOnlyContext();
          }

          @Override
          public DirContext getReadWriteContext() throws NamingException {
            return pcs.getReadWriteContext();
          }

          @Override
          public DirContext getContext(String principal, String credentials)
              throws NamingException {
            return contextSource.getContext(principal, credentials);
          }

          @Override
          public DistinguishedName getBaseLdapPath() {
            return pcs.getBaseLdapPath();

          }

          @Override
          public LdapName getBaseLdapName() {
            return pcs.getBaseLdapName();
          }

          @Override
          public String getBaseLdapPathAsString() {
            return pcs.getBaseLdapPathAsString();
          }
        });