这个ldap过滤器连接可以在一个语句中完成吗?

时间:2016-05-25 12:59:01

标签: ruby-on-rails active-directory ldap

我从rails目录的活动目录中提取员工姓名。除了有一些'非真实的人'条目有一个cn =人,如'会议室'之外,它总体上起作用。我需要消除那些。我可以通过迭代过滤器连接来做到这一点,但这似乎非常低效和kludgy。

我现在拥有的是

    filter1 = (Net::LDAP::Filter.ge( "sn", "a"))
    filter2 = Net::LDAP::Filter.eq( "givenName", "c*" )
    filter3 = Net::LDAP::Filter.ne("samaccountname", "croom" )
    treebase = "dc=xxxxxx,dc=com"

    joined_filter = Net::LDAP::Filter.join(filter1, filter2)
    joined_filter = Net::LDAP::Filter.join(joined_filter, filter3)

    @temp_search = ldap.search( :base => treebase, :filter => joined_filter )

这给了我所有员工的姓氏大于或等于'a'(我知道需要调整)和给定名称以'c'开头。 Filter3不包括会议室“croom”。似乎应该有一些方法将数组传递给过滤器。如果我尝试将所有三个过滤器传递给一个连接,我得到一个“错误的参数数量”

有没有办法通过多个排除项目,例如'croom''croom2''breakroom'等?

1 个答案:

答案 0 :(得分:2)

使用Net::LDAP库似乎无法像您建议的那样将数组传递给Net::LDAP::Filter对象。但是,您可以使用类#&方法加入过滤器。

类似的东西:

filter1 = Net::LDAP::Filter.ge( "sn", "a")
filter2 = Net::LDAP::Filter.eq( "givenName", "c*" )
filter3 = Net::LDAP::Filter.ne("samaccountname", "croom" )
treebase = "dc=xxxxxx,dc=com"

joined_filter = filter1 & filter2 & filter3

@temp_search = ldap.search(:base => treebase, :filter => joined_filter)

或者好一点:

filters = Net::LDAP::Filter.ge( "sn", "a") &
          Net::LDAP::Filter.eq( "givenName", "c*" ) &
          Net::LDAP::Filter.ne("samaccountname", "croom" )
treebase = "dc=xxxxxx,dc=com"

@temp_search = ldap.search(:base => treebase, :filter => filters)

查看net ldap过滤器class,您可以看到一些其他方便的方法。