Spring ldap复合了搜索请求

时间:2014-10-21 15:00:56

标签: java ldap spring-ldap

我是Spring LDAP的新手,想了解以下内容。是否可以在一个搜索中“复合”2个或更多个搜索,同时使用迭代器?

例如,我的代码现在看起来像这样:

    List result = ldapTemplate.search(baseDn, encode, searchControls2,
            genericContextMapper);

BaseDn指向LDAP树的某个分支,genericContextMapper有一个迭代器,我通过我的代码逐渐获取结果。

但是如果我想传递超过1个BaseDN,每个指向完全不同的LDAP分支,我​​希望迭代器一旦完成前一个就开始使用下一个BaseDN?我可以通过Spring LDAP进行这种链接吗?

我知道我可以通过创建我自己的自定义类来实现这一目标,这个类只是将结果“粘在一起”,但我想知道是否有更简单的开箱即用解决方案。

谢谢!

1 个答案:

答案 0 :(得分:0)

你可以试试这个

<bean id="authenticator" class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator">
    <constructor-arg ref="contextSource"/>
    <property name="userSearch" ref="userSearch" />
</bean> 

<bean id="userSearch" class="com.security.OUUserSearch">
    <property name="userSearches" ref="userSearches" />
</bean>

<util:list id="userSearches">
    <ref bean="userSearch1" />
    <ref bean="userSearch2" />
</util:list>

<bean id="userSearch1" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
    <constructor-arg value="OU=test1" />
    <constructor-arg value="(uid={0})" />
    <constructor-arg ref="contextSource"/>
    <property name="searchSubtree" value="true" />

</bean>
<bean id="userSearch2" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
    <constructor-arg value="OU=test2" />
    <constructor-arg value="(uid={0})" />
    <constructor-arg ref="contextSource"/>
    <property name="searchSubtree" value="true" />

OUUserSearch是

public class OUUserSearch implements LdapUserSearch   
{
List<LdapUserSearch> myUserSearches = null;

public DirContextOperations searchForUser(String theUsername)
{
    DirContextOperations theResult = null;  
    for(LdapUserSearch aSearch : myUserSearches)
    {
        try
        {
            theResult = aSearch.searchForUser(theUsername);
            if (theResult != null)
            {
                // we are done
                break;
            }
        }
        catch (Exception e)
        {
            String aMessage = e.getLocalizedMessage();
            task.debug(aMessage);
        }
    }
    if (theResult == null)
    {
        throw new UsernameNotFoundException("Unable to authenticate user (" + theUsername + ")");
    }
    return theResult;
}

public List<LdapUserSearch> getUserSearches() { return myUserSearches;}
public void setUserSearches(List<LdapUserSearch> theSearches) {myUserSearches = theSearches;}