我尝试共享ldap连接。对于Java中的配置,我发现:Spring LDAP PoolingContextSource通过注释
@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);
}
我如何在AuthenticationManagerBuilder中设置我的PoolingContextSource ?它不是适用的类型。当我使用ldapContextSource()而不使用PoolingContextSource Bean时,只要连接不超时,它就可以工作:(
谁能给我点提示吗?无法找到解决接口不兼容问题的好方法。这就是我所做的。
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();
}
});