将Ldap用户与使用Java的组关联
我在找到如何将#Ldap用户与给定组关联时遇到问题。
这就是我尝试过的:
Attributes attrs = new BasicAttributes(); BasicAttribute basicAttrs = new BasicAttribute("objectclass"); basicAttrs.add("top"); basicAttrs.add("person"); BasicAttribute memberOf = new BasicAttribute("memberOf"); memberOf.add("Managers"); // Tried with distinguished name too memberOf.add("Administrators"); // Tried with distinguished name too attrs.put(basicAttrs); attrs.put("cn", user.getLogin()); attrs.put("name", user.getLogin()); attrs.put("login", user.getLogin()); attrs.put("mail", user.getMail()); attrs.put("displayName", user.getDisplayName()); attrs.put("memberOf", memberOf); try { ctx.bind("CN=" + user.getLogin() + "," + baseDn, null, attrs); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); }
我还尝试使用以下可分辨名称:“CN = Managers,OU = ,OU = Users,OU = ,DC = com”,但不起作用。 我认为应该在某个地方引用Ldap组。
但是我收到了这个错误:
javax.naming.directory.InvalidAttributeValueException: Malformed 'memberOf' attribute value; remaining name 'CN=lcarvalho,OU=,OU=Users,OU=,DC=com' at com.sun.jndi.ldap.LdapClient.encodeAttribute(LdapClient.java:951) at com.sun.jndi.ldap.LdapClient.add(LdapClient.java:999) at com.sun.jndi.ldap.LdapCtx.c_bind(LdapCtx.java:396) at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_bind(ComponentDirContext.java:277) at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.bind(PartialCompositeDirContext.java:197) at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.bind(PartialCompositeDirContext.java:186) at javax.naming.directory.InitialDirContext.bind(InitialDirContext.java:158) ...
这是我的应用程序行之外的所有堆栈跟踪。
如果您正在使用OpenLDAP,memberOf覆盖会自动维护memberOf属性,您的应用程序根本不应该写它。 您应该做的是将用户的DN添加到他正在加入的组的uniqueMember或roleOccupant等属性中。 然后它的DN将神奇地出现在他的memberOf属性中。
很可能你的DN是错误的,因为你似乎已经指定了一个额外的组织单位而不是域组件:
"CN=Managers,OU=,OU=Users,OU=,DC=com"
应该:
"cn=Managers,ou=,ou=Users,dc=,dc=com"
在LDAP中,目录结构以2个域组件开始,这两个域组件是反向的公司域名(按照惯例)。
为了使您的代码有效,您必须考虑以下因素:
-
在LDAP服务器中加载了一个模式“Person”
-
在“Person”模式中定义了一个属性“MemberOf”
-
“MemberOf”需要完整的DN作为条目
我还建议你看一下UnboundID LDAP SDK 。
希望有所帮助。
memberOf
属性的值是错误的。 memberOf
属性可能是可分辨名称。 如果对属性的语法,排序或匹配规则有疑问,LDAP客户端应查阅模式( 根DSE中可能存在的基本DN)。
我有同样的问题。 使用ldap的任何客户端检查此属性的值类型(例如:Apache Directory Studio)。 如果您尝试使用int值替换String类型的属性,则会抛出此错误。
- Java SSO:针对Active Directory的Kerberos身份validation
- 为什么JDK1.8.0u121无法找到kerberos default_tkt_enctypes类型? (KrbException:default_tkt_enctypes没有支持的默认etypes)
- 检测使用Java Web应用程序登录计算机的用户
- 在Java中使用LDAP的最简单方法(Eclipse)
- 使用JNDI / Java中的当前用户在LDAP上进行身份validation
- 使用LDAP / Java启用Active Directory用户
- 密码的SPNEGO身份validation问题
- 在ssl(ldaps)的支持下连接活动目录
- 每次从Ldap连接池返回新连接时