Java OpenLdap服务器,SpringLDAP用户绑定(inetOrgPerson)没有这样的对象

Java OpenLdap服务器,SpringLDAP用户绑定(inetOrgPerson)没有这样的对象,java,spring,ldap,openldap,spring-ldap,Java,Spring,Ldap,Openldap,Spring Ldap,我刚刚安装了一个OpenLDAP服务器,并尝试在其上连接、添加、获取用户和组。 由于我是ldap新手,如果您能分享关于spring ldap的教程,那将是非常好的:/ 下面是我的绑定代码: 用户类别: public class User implements Serializable{ private String id; private String userName; private String firstName; private String last

我刚刚安装了一个OpenLDAP服务器,并尝试在其上连接、添加、获取用户和组。 由于我是ldap新手,如果您能分享关于spring ldap的教程,那将是非常好的:/

下面是我的绑定代码:

用户类别:

public class User implements Serializable{

    private String id;
    private String userName;
    private String firstName;
    private String lastName;
    private String email;
    private String password;
    private String department;
    private String groups[];
}
保存方法:

public User save( final User user ){
        init();
        Name dn = buildDn( user );
        Attributes attributes = buildAttributes( user );

        logger.info( "trying to save DN  " + dn + " and attributes " + attributes );

        ldapTemplate.bind( dn, null, attributes );

        // Update Groups
        for( String group : user.getGroups() ){
            try{
                DistinguishedName groupDn = new DistinguishedName();
                groupDn.add( "ou", "Groups" );
                groupDn.add( "cn", group );
                DirContextOperations context = ldapTemplate.lookupContext( groupDn );
                context.addAttributeValue( "memberUid", user.getUserName() );
                ldapTemplate.modifyAttributes( context );
            }
            catch( Exception e ){
                e.printStackTrace();
            }
        }

        logger.info( "successfuly saved " );
        return user;

    }
buildDN:

private Name buildDn( final User user ){
        DistinguishedName dn = new DistinguishedName();
        dn.add( "ou", "People" );
        if( user.getDepartment() != null ){
            dn.add( "ou", user.getDepartment() );
        }
        dn.add( "uid", user.getUserName() );
        return dn;
    }
构建属性:

private Attributes buildAttributes( final User user ){
        Attributes attrs = new BasicAttributes();
        BasicAttribute ocattr = new BasicAttribute( "objectClass" );
        // ocattr.add( "person" );
        ocattr.add( "inetOrgPerson" );
        attrs.put( ocattr );
        attrs.put( "cn", user.getFirstName() );
        // attrs.put( "rdn", "uid" ); // TODO check how to assign rdn
        attrs.put( "sn", user.getLastName() );
        attrs.put( "userPassword", "{SHA}" + this.encrypt( user.getPassword() ) );
        attrs.put( "mail", user.getEmail() );

        return attrs;
    }
这里有一个例外:

org.springframework.ldap.NameNotFoundException: [LDAP: error code 32 - No Such Object]; nested exception is javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name 'uid=sercan,ou=People'
    at org.springframework.ldap.support.LdapUtils.convertLdapException(LdapUtils.java:183)
    at org.springframework.ldap.core.LdapTemplate.executeWithContext(LdapTemplate.java:820)
    at org.springframework.ldap.core.LdapTemplate.executeReadWrite(LdapTemplate.java:812)
    at org.springframework.ldap.core.LdapTemplate.bind(LdapTemplate.java:990)
    at com.***.usr.mng.library.service.impl.UserServiceImpl.save(UserServiceImpl.java:101)
    at com.***.usr.mng.library.handler.impl.UserHandlerImpl.saveUser(UserHandlerImpl.java:45)
    at com.***.usr.mng.library.handler.impl.UserManagementHandlerImpl.handleRequest(UserManagementHandlerImpl.java:62)
    at com.***.usr.mng.service.controller.UserManagementController.processRequest(UserManagementController.java:83)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name 'uid=sercan,ou=People'
    at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3112)
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3033)
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2840)
    at com.sun.jndi.ldap.LdapCtx.c_bind(LdapCtx.java:420)
    at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_bind(ComponentDirContext.java:295)
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.bind(PartialCompositeDirContext.java:215)
    at javax.naming.directory.InitialDirContext.bind(InitialDirContext.java:182)
    at org.springframework.ldap.core.LdapTemplate$21.executeWithContext(LdapTemplate.java:992)
    at org.springframework.ldap.core.LdapTemplate.executeWithContext(LdapTemplate.java:817)
我找到了解决办法

dn.add( "ou", "People" );
我正在尝试将人员添加到人员组织单元,但它不存在


谢谢。

虽然您提供的代码肯定能满足您的需要,但库中包含的一些功能将使您的工作更轻松

最简单的方法是使用,它几乎删除了所有的锅炉板,并在域类上使用声明性映射

如果您决定继续使用,我鼓励您充分利用它的功能(更具体地说,您可以直接向指定的绑定方法提交DirContextOperation实例):

有很多示例,源代码中也包含了一些示例来帮助您入门(有一个使用ODM的简单示例,另一个使用DirContextOperations,最后是一个使用ODM的完整用户管理应用程序)


最后,请注意DifferentizedName类在2.x版中已被弃用;您应该使用中的或实用程序方法来处理可分辨名称(如果您使用ODM,通常不必这样做)。

好的,谢谢您给出了这么好的答案,但我在ldap方面是一个真正的新手。你能分享一些教程吗?我如何创建ou单位?我无法创建一个。关于ODM最好的教程可能是。要创建ou条目,只需使用objectclass organizationalUnit创建一个条目,设置ou属性,就可以了。谢谢!非常好的知识。
Name dn = buildDn(user);
DirContextAdapter context = new DirContextAdapter(dn);

context.setAttributeValues("objectclass", new String[] {"top", "person"});
context.setAttributeValue("cn", user.getFullname());
// populate more attributes

ldapTemplate.bind(context);