java使用虚拟属性操作LDAP(opends)用户,角色,组

1。创建测试用户和组

测试用户:

dn: uid=testuser,ou=users,ou=open,ou=groups,dc=drm,dc=dbs
givenName: testuser
objectClass: person
objectClass: inetorgperson
objectClass: organizationalPerson
objectClass: top
uid: testuser
cn: testuser
sn: testuser

 

测试组

dn: cn=testgroup,ou=roles,ou=open,ou=groups,dc=drm,dc=dbs
objectClass: top
objectClass: groupofUniqueNames
description: testgroup
cn: testgroup
UniqueMember:uid=testuser,ou=users,ou=open,ou=groups,dc=drm,dc=dbs

 

2。使用ismemberof 查询用户和组

LDAP下不管是动态组还是静态组,都可以使用ismemberof虚拟属性来实现以下三个功能

1)To List All Members in Your Static Group                       ---查询组下的所有用户

这个最简单,只要设置过滤器条件为"(isMemberOf=cn=testgroup,ou=roles,ou=open,ou=groups,dc=drm,dc=dbs)"就可以了

SearchControls sc = new SearchControls();
  sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
  try {
   DirContext dirctx=getLdapContext();
   NamingEnumeration iter = dirctx.search(searchRoot, "(isMemberOf=cn=testgroup,ou=roles,ou=open,ou=groups,dc=drm,dc=dbs)",sc);
   while (iter != null && iter.hasMoreElements()) {
    SearchResult result = (SearchResult) iter.next();        
    String userDN = result.getNameInNamespace();
    System.out.println(userDN);             
   }
   dirctx.close();
  } catch (Exception e) {
     e.printStackTrace();
  }

 

 

 

 

2)To List All Groups to Which a User Is a Member           ---查询用户所属的所有组

这里要注意一点,关于虚拟属性(ismemberof),在查询时需要明确指定,否则不会返回该属性,这里通过调用SearchContrls的setReturningAttributes方法来实现

 

SearchControls sc = new SearchControls();
  sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
  String returnedAtts[] = {"isMemberOf"};
  sc.setReturningAttributes(returnedAtts);
  try {
   DirContext dirctx=getLdapContext();
   NamingEnumeration iter = dirctx.search(ldapRoot, "(uid=testuser)",sc);
   if (iter != null && iter.hasMoreElements()) {
    SearchResult result = (SearchResult) iter.next();
    Attributes attrs=result.getAttributes();    
    Attribute oneAttr=attrs.get("ismemberof");
    NamingEnumeration groupIter=oneAttr.getAll();
    while(groupIter.hasMoreElements()){
     String groupDn=(String)groupIter.next();
     System.out.println(groupDn);
    }            
   }
   dirctx.close();
  } catch (Exception e) {
     e.printStackTrace();
  }

 

3)To Determine Whether a User is a Member of a Group---查看用户是否属于组成员

这个比较简单,在1)的基础上增加过滤条件为

"(&(uid=testuser)(isMemberOf=cn=testgroup,ou=roles,ou=open,ou=groups,dc=drm,dc=dbs))"

如果用户在组下,则返回整个用户节点

SearchControls sc = new SearchControls();
  sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
  try {
   DirContext dirctx=getLdapContext();
   NamingEnumeration iter = dirctx.search(ldapRoot, "(&(uid=testuser)(isMemberOf=cn=testgroup,ou=roles,ou=open,ou=groups,dc=drm,dc=dbs))",sc);
   if (iter != null && iter.hasMoreElements()) {
    SearchResult result = (SearchResult) iter.next(); 
//    Attributes attrs=result.getAttributes(); 
    String userDN = result.getNameInNamespace();
    System.out.println(userDN);             
   }else{
    System.out.println("user not in group");
   }
   dirctx.close();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 

 

3.关于角色。opends官网明确说明不支持dsee中的角色机制(说是非标准化),但是可以通过设置nsRole虚拟属性兼容那边的角色管理

1)设置方法可以参考

https://www.opends.org/wiki/page/SimulatingDSEERolesInOpenDS

大致是把角色看成了一个动态组

2)设置成功后可以使用nsRole作为虚拟属性来实现类似ismemberof的功能。需要注意的是nsRoleDn和nsRole的区别

nsRoleDn类似动态组的memberURL是写在实体节点下的属性

nsRole类似虚拟属性ismemberof,客户端请求这个属性时,它会根据需要生成查询结果

3)要注意的是opends与dsee另一个区别在于定义aci是,通配符“*”在opends下是不包含虚拟属性操作的,也就是说如果不明确指定nsRole,并授予权限,而用“*”号代替,被授权用户也是无法使用这个操作的。

4)其他用法通ismemberof

 

4.另外关于Filter的写法可参考

https://www.opends.org/wiki/page/HowToSearchInOpenDS

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值