【问题标题】:How do I Get memberOf attribute from ldap DirContextOperations如何从 ldap DirContextOperations 获取 memberOf 属性
【发布时间】:2013-03-04 09:15:33
【问题描述】:

我正在尝试获取用户所属组的列表,目前我可以获得以下大多数属性

CustomLdapUserDetails.Essence essence = new CustomLdapUserDetails.Essence();
essence.setDn(dn);
Object passwordValue = ctx.getObjectAttribute(passwordAttributeName);
String givennameValue = (String)ctx.getObjectAttribute("givenname");
String snValue = (String)ctx.getObjectAttribute("sn");
String titleValue = (String)ctx.getObjectAttribute("title");
essence.setFirstname(givennameValue);
essence.setLastname(snValue);

但我不知道如何获取 memberOf 属性。如果我将整个 DirContextOperations 输出为字符串,我会得到以下内容

org.springframework.ldap.core.DirContextAdapter: dn=uid=emp123 {rdn=uid=emp123,
whenCreated=20110816063203.0Z,
objectCategory=CN=fompanyPerson,CN=Schema,CN=Configuration,CN={9F17F445-56C4-42D9-
B7C6-B630FFEA7F07}, badPwdCount=0, otherTelephone=123-456789, businessUnit=IREIRE BU, 
ntAccount=DMN1\emp123, managerID=emp987, objectGUID=5?
?e6A??????/, mail=emp123@somewhere.com, uid=emp123, companyWorkRelationship=EMP, 
memberOf[0]=CN=ABC IREIRE,OU=AutoGroups,DC=entdir,DC=gtn,DC=com, 
memberOf[1]=CN=azgEntJazzUsers,OU=AutoGroups,DC=entdir,DC=gtn,DC=com, companySite=DBL, 
companyCostCenter=91827, companyBusinessGroup=IREIRE BG, ntDomain=DMN1, instanceType=4, 
corpID=emp123, objectSid=  I???&?C?k?J???????, st=XX, badPasswordTime=0, vdejoindn=P-
ENTDIRXXX-1:uid=emp123,DC=entdirXXX,DC=gtn,DC=com, companySourceSystem=C-WORKSYSTEM, 
objectClass[0]=top, objectClass[1]=person, objectClass[2]=organizationalPerson, 
objectClass[3]=user, objectClass[4]=inetOrgPerson, objectClass[5]=fompanyPerson, 
company=ABC DEV, name=emp123, sn=Smith, exchangeAlias=emp123, telephoneNumber=1-987-6543, 
ntDomainRelative=DMN1, uSNChanged=999111, physicalDeliveryOfficeName=DXI, 
ntAccountRelative=DMN1\emp123, cn=Smith, John, exchangeServer=someServer, 
documentumUserName=Smith JOHN emp123, title=SOFTWARE ENGINEER/DEVELOPER, 
otherCertMailbox=emp123@xyz.somewhere.com, msDS-UserAccountDisabled=TRUE, 
managerName=Bloggs, Joe, givenName=John, uSNCreated=18418957, displayName=Smith, John, 
pwdLastSet=629579433359695509, fompanyPersonStatus=A, whenChanged=20120266070711.0Z, 
o=IREIRE BU, distinguishedName=uid=emp123,DC=entdirXXX,DC=gtn,DC=com, eDARevoke=N, 
division=SEF-GL , manager=uid=emp987,DC=entdirXXX,DC=gtn,DC=com, 
exchangeDirectory=SMXZG1DB, samAccountName=emp123, sametimeServer=cvxcluster}

我需要得到的是每个memberOf的CN值到一个字符串数组中,我试过了:

ctx.getObjectAttribute("memberOf[1]"))
ctx.getObjectAttribute("memberOf"))
ctx.getObjectAttribute("memberOf=CN")) 

我在网上看到过设置的例子,但我找不到任何获取的例子,真的比获取其他属性复杂得多吗?

任何建议将不胜感激

【问题讨论】:

    标签: java spring ldap spring-ldap


    【解决方案1】:

    你可能只从最后错过了一个“s”。试试:

    ctx.getObjectAttributes("memberOf")
    

    javadoc 阐明了singularplural 表单方法之间的区别。 (即使给定的属性是多值的,前者也只返回第一个值。)

    【讨论】:

    • 应用上述解决方案后,我得到了对象数组。现在,我想解析该字符串对象以获取经过身份验证的用户组,我该怎么办?我应该解析字符串还是有任何 LDAP 实用程序可以为我提供经过身份验证的用户组?我正在低于字符串数组。 cn=admin,cn=users,cn=example,cn=org cn=team1,cn=users,cn=example,cn=org cn=team2,cn=users,cn=example,cn=org 从上面的输出,它很明显,经过身份验证的用户是 3 个组的成员,即 admin、team1、team2
    【解决方案2】:

    您是否使用 Active Directory 作为 LDAP 提供程序? 并非所有 LDAP 提供程序都在用户上具有 memberOF 属性。

    获取用户组的正确方法是在组中搜索过滤器,例如:

    (member=<fully distinguished name of user>)
    

    返回属性“CN”。

    【讨论】:

    • 这只是“正确的”如果没有memberOf属性。否则它会慢很多倍,因此非常不合适。
    • 问题还在于memberOf 不是LDAPv3 架构的一部分。
    猜你喜欢
    • 2014-05-17
    • 2017-09-05
    • 2010-12-03
    • 2019-11-07
    • 1970-01-01
    • 2016-05-03
    • 2022-08-23
    • 1970-01-01
    • 2013-12-14
    相关资源
    最近更新 更多