簡體   English   中英

如何檢查用戶是否在LDAP組中

[英]How to check if a user is in an LDAP group

問題

我想查看用戶“ john”是否在組“ Calltaker”中。 我似乎無法在搜索過濾器上正確使用語法來檢查特定組中的特定用戶。 我可以列出組中的所有用戶以驗證所需的用戶在那里。

問題

  1. ldap搜索過濾器確定特定用戶是否在特定組中的正確語法是什么(在Tivoli Access Manager中)?
  2. 我應該如何檢查該搜索字符串給出的返回的LDAPEntry對象,以查看該用戶是否在組中?

信息

  1. john在“ cn = users,dc = ldap,dc = net”中定義
  2. Calltaker在“ cn = groups,dc = ldap,dc = net”中定義
  3. 我正在從Java查詢TAM的ldap

使用searchfilter為"cn=Calltaker"我可以打印出搜索結果,以便調用nextEntry.toString包含用戶列表。 請參閱下面的示例1

這是我嘗試過的一些不起作用的搜索過濾器(aka searchResults.next()引發錯誤):

(&(objectclass=groupOfUniqueName)(uniquemember=uid="+ username + ",cn=groups,dc=ldap,dc=net))
(&(objectclass=groupOfUniqueName)(uniquemember=uid="+ username + ",cn=users,dc=ldap,dc=net))
(uniquemember=uid="+ username + ",cn=users,dc=ldap,dc=net)

示例1)僅使用searchFilter="cn=Calltaker"搜索組,驗證其是否包含用戶:

System.out.println(nextEntry.toString()); //added newlines for readability
 nextEntry: 
 LDAPEntry: 
 cn=Calltaker,cn=groups,dc=ldap,dc=net; 
 LDAPAttributeSet: 
 LDAPAttribute: {type='objectclass', values='groupOfUniqueNames','top'} 
 LDAPAttribute: {type='uniquemember', 
  values=
     'uid=placeholder,cn=users,dc=ldap,dc=net',
     'secAuthority=default',
     'uid=john,cn=users,dc=ldap,dc=net',
     'uid=sally,cn=users,dc=ldap,dc=net', ....etc

碼:

public boolean isUserInGroup(username){
    boolean userInGroup = false;

    String loginDN = "uid=" + admin_username + "," + "cn=users,dc=ldap,dc=net";
    String searchBase = "cn=groups,dc=ldap,dc=net";
    int searchScope = LDAPConnection.SCOPE_SUB; 
    searchFilter = "(&(objectclass=ePerson)(uniquemember=uid="+ username + ",cn=users,dc=ldap,dc=net))";

    //Connect
    LDAPConnection lc = connect(hosts);
    lc.bind(LDAPConnection.LDAP_V3, loginDN, admin_password.getBytes("UTF8"));
    lc.getAuthenticationDN();

    LDAPSearchResults searchResults = lc.search(searchBase,
            searchScope, 
            searchFilter, 
            null,           // return all attributes
            false);         // return attrs and values

    while (searchResults.hasMore()) {
        LDAPEntry nextEntry = null;
        try {
            nextEntry = searchResults.next();
        } catch (LDAPException e) {
            // Exception is thrown, go for next entry
            if (e.getResultCode() == LDAPException.LDAP_TIMEOUT || e.getResultCode() == LDAPException.CONNECT_ERROR)
                break;
            else
                continue;
        }
        //TODO some check to verify nextEntry shows the user in the group
        userInGroup = true;
        LDAPAttributeSet attributeSet = nextEntry.getAttributeSet();
        Iterator<LDAPAttribute> allAttributes = attributeSet.iterator();
        while (allAttributes.hasNext()) {
            LDAPAttribute attribute = (LDAPAttribute) allAttributes.next();
            String attributeName = attribute.getName();
            System.out.println("found attribute '" + attributeName + "' with value '" + attribute.getStringValue() + "'");
        }
    }
    lc.disconnect();
return userInGroup;
}

** 編輯 **

從EJP實現了答案,將searchBase更改為包括組

起作用的代碼:

private static final String admin_username = "foo";
private static final String[] hosts = new String[]{"foohost.net"};
public boolean isUserInGroup(String username, String group){
    boolean userInGroup = false;

    String loginDN = "uid=" + admin_username + "," + "cn=users,dc=ldap,dc=net";
    String searchBase = "cn=" + group + "," + "cn=groups,dc=ldap,dc=net";
    int searchScope = LDAPConnection.SCOPE_SUB; 
    searchFilter = "(&(objectclass=groupOfUniqueNames)(uniquemember=uid="+ username + ",cn=users,dc=ldap,dc=net))";

    //Connect
    LDAPConnection lc = connect(hosts);
    lc.bind(LDAPConnection.LDAP_V3, loginDN, admin_password.getBytes("UTF8"));
    lc.getAuthenticationDN();

    LDAPSearchResults searchResults = lc.search(searchBase,
            searchScope, 
            searchFilter, 
            null,           // return all attributes
            false);         // return attrs and values

    while (searchResults.hasMore()) {
        LDAPEntry nextEntry = null;
        try {
            nextEntry = searchResults.next();
        } catch (LDAPException e) {
            // Exception is thrown, go for next entry
            if (e.getResultCode() == LDAPException.LDAP_TIMEOUT || e.getResultCode() == LDAPException.CONNECT_ERROR)
                break;
            else
                continue;
        }
        //A result was found, therefore the user is in the group
        userInGroup = true;
    }
    lc.disconnect();
    return userInGroup;
}

ldap搜索過濾器確定特定用戶是否在特定組中的正確語法是什么(在Tivoli Access Manager中)?

您使用了兩種過濾器,但要搜索的objectClassgroupofUniqueNames (復數)。

我應該如何檢查該搜索字符串給出的返回的LDAPEntry對象,以查看該用戶是否在組中?

沒有。 他會的,否則該組將不會在搜索中返回。 您需要做的就是檢查搜索結果是否為空。

這是我嘗試過的一些不起作用的搜索過濾器(aka searchResults.next()引發錯誤):

拋出什么錯誤?

(&(objectclass=groupOfUniqueName)(uniquemember=uid="+ username + ",cn=groups,dc=ldap,dc=net))

除了groupOfUniqueName ,這沒什么不對的。 您應該使用諸如{0}類的搜索過濾器參數,而不是將其構建到搜索字符串中。

(&(objectclass=groupOfUniqueName)(uniquemember=uid="+ username + ",cn=users,dc=ldap,dc=net))

這將在cn=users子樹中搜索一個組。 除非您在cn=users下具有組,否則這似乎不太可能。

(uniquemember=uid="+ username + ",cn=users,dc=ldap,dc=net)

這將選擇非組。 您不需要這樣做:您需要objectClass部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM