Spring MVC REST: Method to Search Active Directory using LdapTemplate, LdapContextSource and SpringSecurityAuthenticationSource -


i have spring mvc rest application. have implemented spring security ad authentication provider. need implement controller methods can in searching ad. hence defined user details service autowires ldaptemplate perform query on ad.

userdetailssvc.java

@component public class userdetailssvc {      @autowired     ldaptemplate ldaptemplate;      private final logger logger = logger.getlogger(userdetailssvc.class);      @suppresswarnings("unchecked")     public userdetails getuserdetails(string username) {         // authentication authentication = securitycontextholder.getcontext().getauthentication();         // logger.info("auth details: " + authentication.getprincipal() + "/" + authentication.getcredentials());          andfilter filter = new andfilter();         filter.and(new equalsfilter("objectclass", "user"));         filter.and(new equalsfilter("userprincipalname", username));          logger.info("ad filter: " + filter.encode());         linkedlist<map<string, string>> list = (linkedlist<map<string, string>>)                   ldaptemplate.search("", filter.encode(), new userattributesmapper());         logger.info("ad search complete");          userdetails ud = new userdetails();         if (!list.isempty()) {             // should return 1 item             ud.setname(username);             ud.setdetails(list.get(0));         }         return ud;     }      private class userattributesmapper implements attributesmapper {         @override         public map<string, string> mapfromattributes(attributes attributes) throws javax.naming.namingexception {             map<string, string> map = new hashmap<string, string>();             logger.info("userattributesmapper: " + attributes.tostring() );              string fullname = (string) attributes.get("displayname").get();              string email = (string) attributes.get("mail").get();              string title = (string) attributes.get("title").get();             string image = (string) attributes.get("extensionattribute1").get();             string username = (string) attributes.get("uid").get();              map.put("fullname", fullname);             map.put("email", email);             map.put("title", title);             map.put("image", image);             map.put("username", username);              logger.info("user details : " + map.get("fullname") + map.get("email") + map.get("title") + map.get("image") + map.get("username"));              return map;         }     } } 

snippet of spring security xml files.

spring-security.xml

<beans:bean id="ldaptemplate" class="org.springframework.ldap.core.ldaptemplate">     <beans:constructor-arg ref="contextsource" />     <beans:property name="ignorepartialresultexception" value="true" /> </beans:bean> <beans:bean id="contextsource" class="org.springframework.ldap.core.support.ldapcontextsource">   <beans:property name="url" value="${ldap.url}" />   <beans:property name="base" value="${ldap.basecn}" />   <beans:property name="authenticationsource" ref="authenticationsource" /> </beans:bean> <beans:bean id="authenticationsource" class="org.springframework.ldap.authentication.defaultvaluesauthenticationsourcedecorator">   <beans:property name="target" ref="springsecurityauthenticationsource" />   <beans:property name="defaultuser" value="{ldap.defuser}" />   <beans:property name="defaultpassword" value="{ldap.password}" /> </beans:bean> <beans:bean id="springsecurityauthenticationsource"   class="org.springframework.security.ldap.authentication.springsecurityauthenticationsource" /> 

the problem ldaptemplate.search throws nullpointerexception. can please help?

here exception got:

java.lang.nullpointerexception         @ java.util.hashtable.put(hashtable.java:542)         @ org.springframework.ldap.core.support.simpledircontextauthenticationstrategy.setupenvironment(simpledircontextauthenticationstrategy.java:44)         @ org.springframework.ldap.core.support.abstractcontextsource.setupauthenticatedenvironment(abstractcontextsource.java:155)         @ org.springframework.ldap.core.support.abstractcontextsource.getauthenticatedenv(abstractcontextsource.java:481)         @ org.springframework.ldap.core.support.abstractcontextsource.getcontext(abstractcontextsource.java:106)         @ org.springframework.ldap.core.support.abstractcontextsource.getreadonlycontext(abstractcontextsource.java:125)     @ org.springframework.ldap.core.ldaptemplate.search(ldaptemplate.java:287)     @ org.springframework.ldap.core.ldaptemplate.search(ldaptemplate.java:259)     @ org.springframework.ldap.core.ldaptemplate.search(ldaptemplate.java:571)     @ org.springframework.ldap.core.ldaptemplate.search(ldaptemplate.java:556)     @ org.springframework.ldap.core.ldaptemplate.search(ldaptemplate.java:411)     @ org.springframework.ldap.core.ldaptemplate.search(ldaptemplate.java:431)     @ org.springframework.ldap.core.ldaptemplate.search(ldaptemplate.java:451)     @ com.vmware.concorde.appadm.service.userdetailssvc.getuserdetails(userdetailssvc.java:44)     @ com.vmware.concorde.appadm.web.usercontroller.findusers(usercontroller.java:42)     @ sun.reflect.nativemethodaccessorimpl.invoke0(native method)     @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57)     @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43)     @ java.lang.reflect.method.invoke(method.java:601)      @ org.springframework.web.method.support.invocablehandlermethod.invoke(invocablehandlermethod.java:213)     @ org.springframework.web.method.support.invocablehandlermethod.invokeforrequest(invocablehandlermethod.java:126)     @ org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlermethod.invokeandhandle(servletinvocablehandlermethod.java:96)     @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.invokehandlermethod(requestmappinghandleradapter.java:617)     @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.handleinternal(requestmappinghandleradapter.java:578)     @ org.springframework.web.servlet.mvc.method.abstracthandlermethodadapter.handle(abstracthandlermethodadapter.java:80)     @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:923)     @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:852)     @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:882)     @ org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:778)     @ javax.servlet.http.httpservlet.service(httpservlet.java:621)     @ javax.servlet.http.httpservlet.service(httpservlet.java:728)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:305)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210) 

...


thanks kalyan

http://forum.spring.io/forum/spring-projects/data/ldap/130283-search-active-directory-with-ldaptemplate-ldapcontextsource-sp-sec-auth-sou-rce

dont use defaultvaluesauthenticationsourcedecorator, if want use default user , password. defaultvaluesauthenticationsourcedecorator try use spring security user in session perform actions in ldapcontext:

solution:

<beans:bean id="ldaptemplate" class="org.springframework.ldap.core.ldaptemplate">     <beans:constructor-arg ref="contextsource" />     <beans:property name="ignorepartialresultexception" value="true" /> </beans:bean> <beans:bean id="contextsource" class="org.springframework.ldap.core.support.ldapcontextsource">   <beans:property name="url" value="${ldap.url}" />   <beans:property name="base" value="${ldap.basecn}" />   <beans:property name="user" value="${ldap.defuser}" />   <beans:property name="password" value="${ldap.password}" />  </beans:bean> 

Comments

Popular posts from this blog

matlab - Deleting rows with specific rules -

php - MySQLi multi_query results for later use -