当前位置: 首页 > 知识库问答 >
问题:

Spring LdapTemplate使用单独的过滤器在多个基础上搜索

马欣德
2023-03-14

在企业活动目录中具有以下组织结构;

  • DC=foo,DC=bar,DC=com
    • OU=员工
      • CN=员工1
      • CN=雇员2
      • CN=intern1
      • CN=实习生2

      我需要检索一个列表;

      具有“A”属性但不具有“B”属性的员工,以及具有“B”属性但不具有“A”属性的实习生。

      生成Spring LDAP的LdapContextSource通过设置DC=foo,DC=bar,DC=com作为基础,我在LdapTemboard上看不到任何用于设置具有单个过滤器的多个搜索基础的搜索API。

      下面是一个不返回任何匹配项的示例代码;

      @Configuration
      public class LdapConfiguration {
      
          @Autowired
          Environment env;
      
          @Bean
          public LdapContextSource contextSource () {
              LdapContextSource contextSource= new LdapContextSource();
              contextSource.setUrl(env.getRequiredProperty("ldap.url"));
              contextSource.setBase("DC=foo,DC=bar,DC=com");
              contextSource.setUserDn(env.getRequiredProperty("ldap.user"));
              contextSource.setPassword(env.getRequiredProperty("ldap.password"));
              return contextSource;
          }
      
          @Bean
          public LdapTemplate ldapTemplate() {
              return new LdapTemplate(contextSource());        
          }
      
          private List<Contact> ldapsearch(AndFilter filter) {
          OrFilter orFilter = new OrFilter();
          // EMPLOYEE FILTER
          AndFilter employeesFilter = new AndFilter();
          employeesFilter.and(filter);
          // ou=employees
          employeesFilter.and(new EqualsFilter(DirectoryConstants.OU, DirectoryConstants.EMPLOYEES));
          // A=*
          employeesFilter.and(new PresentFilter(DirectoryConstants.A));
          // (!(B=*))
          employeesFilter.and(new NotPresentFilter(DirectoryConstants.B));
          // INTERN FILTER
          AndFilter internFilter = new AndFilter();
          internFilter.and(filter);
          // ou=interns
          internFilter.and(new EqualsFilter(DirectoryConstants.OU, DirectoryConstants.INTERNS));
          // (!(A=*))
          internFilter.and(new NotPresentFilter(DirectoryConstants.A));
          // (B=*)
          internFilter.and(new PresentFilter(DirectoryConstants.B));
      
          orFilter.or(employeesFilter);
          orFilter.or(internFilter);
      
          List<Contact> contacts = null;
          try {
              contacts = ldapTemplate().search(
                      "",
                      orFilter.encode(),
                      new AttributesMapper<Contact>() {
                          public Contact mapFromAttributes(Attributes attrs) throws NamingException {
                              return buildContact(attrs);
                          }
                      });
          } catch (Exception e) {
              logger.error("Active directory search failed. " + e.getMessage());
          }
          return contacts;
      }
      } 
      

      我相信上面的过滤器ou=雇员ou=实习生不应该是过滤器的一部分,而是它们应该是base的一部分(ldapTemboard(). search()的第一个参数)。然而,我找不到任何应用编程接口,既没有将多个碱基设置为ldapTemboard(). search(),也没有为每个碱基设置单独的过滤器。

      关于一步完成这个查询有什么想法吗?

共有1个答案

靳彦
2023-03-14

您可以筛选其OU为DirectoryConstants的项。使用LdapQuery的员工。base(directoryStants.EMPLOYEES)。下面的代码显示了查找所有项,其OU为“dev”,名为objectClass的属性为“group”。

LdapQuery query = LdapQueryBuilder.query()
            .base("ou=dev")
            .where("objectClass").is("group");

    return ldapTemplate.search(query, new AttributesMapper<String>() {
        @Override
        public String mapFromAttributes(Attributes attributes) throws NamingException {
            return (String) attributes.get("cn").get();
        }
    });
 类似资料:
  • 问题内容: 我想在一个实体上使用多个Hibernate过滤器,我尝试了所有没有失败的逻辑,Google以及Hibernate文档都对此提出了不足。我无法想象这是不可能的。(使用Java 6 Hibernate 4.1.9.final) 目前,我有这个: 我想向Testcase类添加第二个独立过滤器。我所追求的是这样的: 这是我尝试过的 我试图像这样向TestCase添加多个@FilterDefs,

  • 问题内容: 我有如下定义的用户对象。 然后我有以下代码: 现在,当我在文本框中键入文本:“ searchText”时,我希望过滤器显示用户名和朋友的姓名/年龄。谁能帮助我做到这一点? 如果我是正确的话,那么我认为我需要为此创建一个自定义过滤器,或者还有其他方法可以完成此操作吗? 问题答案: 因为您想一次过滤两件事-朋友数组和用户的某些属性- 您需要创建自己的接受两个附加参数的自定义过滤器: 然后像

  • 问题内容: 我必须通过一个映射过滤一个对象集合,该映射包含对象字段名称和字段值的键值对。我试图通过stream()。filter()应用所有过滤器。 对象实际上是JSON,因此Map保留了其变量的名称以及它们必须包含的值才能被接受,但是出于简单性的原因,并且由于它与问题无关,因此我编写了一个简单的Testclass来模拟行为: 到目前为止我尝试过的是: 我尝试将Map的forEach放在首位,并将

  • 我必须通过一个映射过滤对象集合,该映射包含对象字段名和字段值的键值对。我正在尝试按stream()应用所有过滤器。过滤器()。 对象实际上是JSON,因此映射包含其变量的名称以及它们必须包含的值,以便被接受,但出于简单的原因,并且由于与问题无关,我编写了一个简单的Testclass来模拟行为: 到目前为止我所尝试的: 我试着将地图的每个部分放在第一位,将集合的流放在第一位,但这两种解决方案都没有按

  • 如何在elasticsearch中使用与聚合相关的过滤器? 官方文档只给出了过滤器和聚合的小例子,没有对查询dsl进行正式描述——例如,将其与postgres文档进行比较。 通过尝试,我发现以下查询被elasticsearch接受(没有解析错误),但忽略了给定的过滤器: 有些人建议使用查询而不是过滤。但官方文件通常建议对精确值进行过滤。查询的另一个问题是:虽然过滤器提供了和,但查询不提供。 有人能

  • 我想要找到合适的正则表达式匹配的行数。输入是通过Java Stream插入的日志文件。我想对这个流应用多个过滤器,但每隔一段时间计算一次。