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
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
Post a Comment