2010-12-01 26 views
1

我收到此错误信息如何按人名搜索LDAP?

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is 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 'cn=Kirsi' 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:659) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:143) 
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:110) 
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

根源

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 'cn=Kirsi' 
org.springframework.ldap.support.LdapUtils.convertLdapException(LdapUtils.java:172) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:306) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:237) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:624) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:535) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:462) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:483) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:503) 
fi.utu.userdetails.LdapManager.findByNameWildCard(LdapManager.java:43) 
net.viralpatel.spring3.controller.ResearcherController.addresearcher(ResearcherController.java:40) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:143) 
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:110) 
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

根源

javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name 'cn=Kirsi' 
com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3066) 
com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2987) 
com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2794) 
com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1826) 
com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1749) 
com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:368) 
com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:338) 
javax.naming.directory.InitialDirContext.search(InitialDirContext.java:257) 
org.springframework.ldap.core.LdapTemplate$3.executeSearch(LdapTemplate.java:231) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:293) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:237) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:624) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:535) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:462) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:483) 
org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:503) 
fi.utu.userdetails.LdapManager.findByNameWildCard(LdapManager.java:43) 
net.viralpatel.spring3.controller.ResearcherController.addresearcher(ResearcherController.java:40) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:143) 
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:110) 
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

谷歌搜索,我发现,这是因为配置DN。我试图从我的contextSource中删除它,但没有帮助。 ContextSource是orginally

<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource"> 
    <property name="url" value=" ldap://ldap.utu.fi " /> 
    <property name="base" value="dc=utu,dc=fi" /> 
    <property name="userDn" value="uid=sysbind,ou=special users,dc=utu,dc=fi" /> 
    <property name="password" value="footogsEp2" /> 
</bean> 

和类:

package fi.utu.userdetails; 

import java.util.List; 

import javax.naming.NamingException; 
import javax.naming.directory.Attributes; 

import org.springframework.ldap.core.AttributesMapper; 
import org.springframework.ldap.core.DirContextOperations; 
import org.springframework.ldap.core.DistinguishedName; 
import org.springframework.ldap.core.LdapTemplate; 
import org.springframework.ldap.core.support.AbstractContextMapper; 
import org.springframework.ldap.filter.AndFilter; 
import org.springframework.ldap.filter.EqualsFilter; 
import org.springframework.ldap.filter.OrFilter; 


public class LdapManager { 

private LdapTemplate ldap; 
private final static String[] PERSON_ATTRS = 
    new String[]{"uid", "mail", "givenName", "sn","cn"}; 

public LdapManager(LdapTemplate template) { 
    this.ldap = template; 
} 

public List<Person> findByNameWildCard(String fullname) { 
    DistinguishedName dn = new DistinguishedName(); 
    dn.add("cn", fullname); 

    AndFilter andFilter = new AndFilter(); 
    andFilter.and(new EqualsFilter("objectclass", "person")); 
    OrFilter affiliationFilter = new OrFilter(); 
    return ldap.search(dn, andFilter.encode(), new PersonContextMapper()); 
} 


private class PersonAttributesMapper implements AttributesMapper { 
    public Object mapFromAttributes(Attributes attrs) throws NamingException { 
     String uid = (String) attrs.get("uid").get(); 
     String mail = (String) attrs.get("mail").get(); 
     String lastname = (String) attrs.get("sn").get(); 
     String firstname = (String) attrs.get("givenName").get(); 
     String fullname = (String) attrs.get("cn").get(); 
     //String status = (String) attrs.get("inetUserStatus").get(); 

     Person person = new Person(); 
     person.setLname(lastname); 
     person.setFname(firstname); 
     person.setEmail(mail); 
     person.setUsername(uid); 
     person.setFullname(fullname); 
     return person; 
    } 
} 

    private static class PersonContextMapper extends AbstractContextMapper { 
    @Override 
    protected Object doMapFromContext(DirContextOperations context) { 
     Person person = new Person(); 
     person.setUsername(context.getStringAttribute("uid")); 
     person.setEmail((context.getStringAttribute("mail"))); 
     person.setLname((context.getStringAttribute("sn"))); 
     person.setFname(context.getStringAttribute("givenName")); 
     person.setFname(context.getStringAttribute("cn")); 

     return person; 
    } 
    } 
} 

有什么不对?

回答

1

看起来像这个错误,你没有使用用户的完整DN,只是cn = kirsi片段。

您需要先根据某些内容(用户名,电子邮件)查询用户的完整DN,然后尝试与其绑定。

+0

我需要找到与用户输入值名称匹配的人员。通过在上面的例子中添加Kirsi的姓氏,我得到了空指针异常。我想它没有发现一件事。我如何实现我所需要的? – JII 2010-12-02 07:18:38